【问题标题】:Function that copies into byte vector reverses values复制到字节向量的函数反转值
【发布时间】:2011-02-13 21:01:05
【问题描述】:

嘿,我已经编写了一个函数来将任何变量类型复制到字节向量中,但是每当我插入一些东西时,它就会被反向插入。

这是代码。

template <class Type>
void Packet::copyToByte(Type input, vector<uint8_t>&output)
{
    copy((uint8_t*) &input, ((uint8_t*) &input) + sizeof(Type), back_inserter(output));
}

现在,每当我添加例如值为 0x2f1f 的 uint16_t 时,它就会被插入为 1f 2f 而不是预期的 2f 1f。

我在这里做错了什么?

问候,Xeross

【问题讨论】:

    标签: c++ vector byte endianness


    【解决方案1】:

    你没有做错任何事。您正在使用小端机器(例如 Pentium)。在这些上,多字节值的低有效字节存储在最小地址。结果就是这样。

    【讨论】:

    • template ...输入输入...(uint8_t*) &input 他没有做错什么吗?
    • @Potatoswatter:需要详细说明吗?
    • @xeros:C++ 不允许您简单地将任何内容转换为 char*。它编译但具有未定义的行为。这是一个经典的例子。而在另一端,你不能回避。如果类有指针怎么办?
    • ...顺便说一下,这里的C风格转换被解释为reinterpret_cast
    • @PotatoSwatter:所以这会导致指针和某些数据类型出现问题,我理解,但大多数数字数据类型将被这个 afaik 接受。如果您知道更好的方法,我很乐意听取您的建议。
    【解决方案2】:
    【解决方案3】:

    如果您使用的是little-endian 机器(例如,x86),则字节将出现反转(即,低位字节将出现在高位字节之前)。

    如果你真的想颠倒字节顺序,可以使用std::reverse

    【讨论】:

    • 我怎样才能检查字节序并采取相应的行动,有没有办法让它总是把所有东西都存储为 big-endian ?另外,如果我将其复制回来,它将具有错误的值,那不是字节序的情况吗?
    • @xeross:您可以在运行时测试平台的字节序;看看stackoverflow.com/questions/2531515/…
    • 我成功地扭转了它们,必须检查到底是怎么回事,但这个答案似乎是最接近的。
    猜你喜欢
    • 1970-01-01
    • 2019-06-25
    • 2014-01-29
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多