将long复制到无符号字符数组的后半部分 我是C++新手。我需要帮助在LSB上存储128位大小的无符号字符数组中的长整数值。例如: long int myLong = 12340; unsigned char myArray[16] = {};
将long复制到无符号字符数组的后半部分 我是C++新手。我需要帮助在LSB上存储128位大小的无符号字符数组中的长整数值。例如: long int myLong = 12340; unsigned char myArray[16] = {};,c++,arrays,pointers,copy,long-integer,C++,Arrays,Pointers,Copy,Long Integer,memcpy(myArray,&myLong,sizeof(long int))在myArray的MSB处复制它,即 0x34300000000000000000000000000000 但是我需要myLong存储在myArray中,作为: 0x00000000000000000000000000003430 注意:我正在一台64位little endian(LSB)机器上工作。我必须将相应的字节向右移动。有没有办法实现这一目标,或者有什么现有的职能可以完成这项工作 编辑:我的错,我否决了m
memcpy(myArray,&myLong,sizeof(long int))
在myArray
的MSB处复制它,即
0x34300000000000000000000000000000
但是我需要myLong
存储在myArray
中,作为:
0x00000000000000000000000000003430
注意:我正在一台64位little endian(LSB)机器上工作。我必须将相应的字节向右移动。有没有办法实现这一目标,或者有什么现有的职能可以完成这项工作
编辑:我的错,我否决了myLong=12340
和myLong=0x12340
输出之间的差异。我相应地修改了问题&yes,如果使用了myLong=0x12340
&memcpy
,myArray
看起来像:
0x40230100000000000000000000000000
如果按照您想要的结果,其中每个半字节(四位,即每个十六进制数字)在结果数组中获得自己的字节,您可以执行以下操作:
size_t i = sizeof(myArray) / sizeof(myArray[0]); // Get one beyond last index of array
for (size_t shift = 0; shift < sizeof(myLong) * 8 && i > 0; shift += 4)
myArray[--i] = static_cast<unsigned char>((myLong >> shift) & 0x0f);
size\u ti=sizeof(myArray)/sizeof(myArray[0]);//在数组的最后一个索引之外获取一个
对于(大小移位=0;移位0;移位+=4)
myArray[--i]=静态_转换((myLong>>shift)&0x0f);
请参阅。这与endianess无关,事实上,结果应该(在32位
长
且在MSB机器上)是0x00 0x01 0x23 0x40 0x00 0x00等
。我不知道用memcpy
这个值怎么得到数字之间的零填充。哦,如果在LSB机器(如x86或x86_64)上执行此操作,则生成的数组将是0x40 0x23 0x01 0x00
后跟全零。我也很困惑。假设您使用的是PowerPC CPU,为什么您的输出以400
结束,而不是040
?你想在末尾加一个零吗?如果你想把它存储在array+12
,那就告诉它memcpy(myArray+12,…)
。正如@JoachimPileborg所指出的,0x12340!=0x01020304
,所以您的期望值有点不明确。在小型endian机器(即x86或x86_64)上,我希望您的示例生成0x402310000…
。