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的方式来写?
本人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的方式来写?
int i = 100;
int j = 200; cArr[0] = (char)i;
cArr[sizeof(int)] = (char)j;
int i = 10000;
...
cArr[0] = (char)i;
...
结果也是对的...在 cArr[0] = (char)i; 中的 (char)i 操作的时候 ,居然没有把 i的高位丢掉么 ???
这样直接赋值,我总有种不放心的感觉...
要改成这样
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);
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));
}
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;
}
但是,在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*参数???