RT
本人C#菜鸟...在C++里面可以这样:char cArr[sizeof(int)*2] = {0};
int i = 100;
int j = 200;
memcpy(cArr, &i, sizeof(i));
memcpy(&cArr[sizeof(int)], &j, sizeof(j));
也就是 当有一个 char 数组,我要将 前sizeof(int)位中放入一个int型值i ,后sizeof(int)位中放入一个int型值j ,就可以像上面那样操作。那类似的操作在C#里面怎么做 ??
char[] cArr = new char[sizeof(int)*2];
int i = 100;
int j = 200;
这样之后,接下来的代码我就不知道该怎么弄了...该怎么写??求教~~ps : 用 unsafe 的方式我会 。还是说,我上面的要求只能用unsafe的方式来写?

解决方案 »

  1.   

    没必要用指针   char[] cArr = new char[sizeof(int) * 2];
                int i = 100;
                int j = 200;            cArr[0] = (char)i;
                cArr[sizeof(int)] = (char)j;
      

  2.   

    没想到居然可以直接赋值...我改成这样:
    int i = 10000;
    ...
    cArr[0] = (char)i; 
    ...
    结果也是对的...在 cArr[0] = (char)i; 中的 (char)i 操作的时候 ,居然没有把 i的高位丢掉么 ???
    这样直接赋值,我总有种不放心的感觉...
      

  3.   

    如果不习惯用C#,可以试试unsafe
      

  4.   

    哦,你有高低位是吗?那这样不行的
    要改成这样
     char[] cArr = new char[sizeof(int) * 2];
                int i = 10000;
                int j = 200;            cArr[0] = (char)(i >> 8);
                cArr[1] = (char)(i & 0xFF);            cArr[sizeof(int)] = (char)(j >> 8);
                cArr[sizeof(int) + 1] = (char)(j & 0xFF);
      

  5.   

    两种方式
                byte[] cArr = new byte[sizeof(int) * 2];            int i = BitConverter.ToInt32(cArr, 0);
                int j = BitConverter.ToInt32(cArr, sizeof(int));            fixed (byte* cArrFixed = cArr)
                {
                    i = *(int*)cArrFixed;
                    j = *(int*)(cArrFixed + sizeof(int));
                }
      

  6.   

    不好意思,搞反了,以为是取值
                byte[] cArr = new byte[sizeof(int) * 2];
                int i = 100;
                int j = 200;
                fixed (byte* cArrFixed = cArr)
                {
                    *(int*)cArrFixed = i;
                    *(int*)(cArrFixed + sizeof(int)) = j;
                }
      

  7.   

    C里面的char在C#里面是byte,C#里面的char是双字节的,所以10000没有丢掉高位。
      

  8.   

    先感谢 楼上所有回答~~我发本贴的原因是 : 我在学习C#的过程中,想将一些C++的exe用C#来改写。
    但是,在C++的网络代码里面,到处都是直接的内存操作,例如 IP包的checksum计算 :USHORT checksum(USHORT* buff, int size)
    {
    unsigned long cksum = 0;
    while(size>1)
    {
    cksum += *buff++;
    size -= sizeof(USHORT);
    }
    // 是奇数
    if(size)
    {
    cksum += *(UCHAR*)buff;
    }
    // 将32位的chsum高16位和低16位相加,然后取反
    cksum = (cksum >> 16) + (cksum & 0xffff);
    cksum += (cksum >> 16);
    return (USHORT)(~cksum);
    }
    这个函数 想问问你们是否直接用unsafe的方式来改写??那如果现在已经将 checksum 用unsafe的方式写在C#程序里了,我调用函数传递参数USHORT* buff时也要用 unsafe的变量?不用unsafe的变量的话,我如何传 USHORT*参数???
      

  9.   

    参数类型必须一致,如果是ushort[]可以先fixed在调用。