【问题标题】:Conversion of unsigned long to std::vector with memcpy, endian?使用 memcpy、endian 将 unsigned long 转换为 std::vector?
【发布时间】:2014-04-12 23:34:38
【问题描述】:

我正在尝试将 unsigned long 转换为 char 向量。

std::vector<char> out(1024);
while(n < length) 
{
    for(int = 0; i < 32; i++)
    {
    //code...
    unsigned long v0 = 0x9514a327;
    //code...
    }
memcpy( &out[n], &v0, sizeof( v0 ) );
}

out 在 while 循环中动态填充(out 存储 v0 的值)。我的问题是,订单已更改为:

out[0] = 0x27
out[1] = 0xa3
out[2] = 0x14
out[3] = 0x95

但我需要:

out[0] = 0x95
out[1] = 0x14
out[2] = 0xa3
out[3] = 0x27

我怎样才能以优雅的方式解决这个问题?

【问题讨论】:

  • 您的代码无法编译,v0 在其范围之外使用。
  • 您的问题称为字节序。您可以使用 htons 在 memcpy 之前将您的值转换为大端(这是您所需要的)。

标签: c++ vector int endianness unsigned


【解决方案1】:

优雅而快速的方法是避免memcpy() 并通过位移直接从long 分配字节。你得到相同的 char-array 甚至独立于主机字节序!

【讨论】:

    【解决方案2】:

    已经很晚了,我没有测试它,但应该给你一个想法

    v0 = ((v0 & 0xFF) << 24) | ((v0 & 0xFF00) << 8) | ((v0 & 0xFF0000) >> 8) | ((v0 & 0xFF000000) >> 24);
    

    【讨论】:

      【解决方案3】:
      for (int n = sizeof v0; n--; )
      {
          out[n] = v0 % 0x100;
          v0 /= 0x100;
      }
      

      展开此循环,您可以(可能)用性能换取优雅。我将其全部隐藏在自己代码中的内联函数后面。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-11
        • 2014-02-19
        • 1970-01-01
        • 1970-01-01
        • 2017-05-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多