【问题标题】:Copy long into second half of unsigned char array将 long 复制到 unsigned char 数组的后半部分
【发布时间】:2013-10-30 13:42:50
【问题描述】:

我是 C++ 新手。我需要帮助将长整数值存储在 LSB 大小为 128 位的 unsigned char 数组中。例如:

long int myLong = 12340;
unsigned char  myArray[16] = {};

memcpy(myArray,&myLong,sizeof(long int)); 将其复制到myArray 的 MSB,即,

0x34300000000000000000000000000000

但我需要将myLong 存储在myArray 中:

0x00000000000000000000000000003430

注意:我正在使用 64 位 little-endian (LSB) 机器。而且我必须将相应的字节向右移动。有没有办法实现这个目标或任何现有的功能可以完成这项工作?

编辑:我的错,我否决了 myLong = 12340myLong = 0x12340 输出之间的区别。我相应地修改了问题&是的,如果使用myLong = 0x12340 & memcpymyArray 看起来像:

0x40230100000000000000000000000000

【问题讨论】:

  • 这与字节序无关,实际上结果应该(在 32 位 long 和 MSB 机器上)是 0x00 0x01 0x23 0x40 0x00 0x00 etc。我不知道您如何获得具有该值的memcpy 的数字之间的零填充。哦,如果您在 LSB 机器(如 x86 或 x86_64)机器上执行此操作,则结果数组将是 0x40 0x23 0x01 0x00 后跟全零。
  • 我也很困惑。假设您使用的是 PowerPC CPU,为什么您的输出以 400 而不是 040 结尾?你想在末尾多加一个零吗?
  • 如果你想把它存储在array+12,那么就告诉它memcpy(myArray+12,....)。而且,正如@JoachimPileborg 所说,0x12340 != 0x01020304,所以你的期望有点不清楚。在小端机器(即 x86 或 x86_64)上,我希望您的示例产生 0x40230100000...

标签: c++ arrays pointers copy long-integer


【解决方案1】:

如果按照您想要的结果,每个半字节(四个位,即每个十六进制数字)在结果数组中都有自己的字节,您可以执行以下操作:

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);

here for a complete example

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    • 2017-04-22
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多