克服 rpc 字节顺序转换

overcome rpc endianness convert

我想将 unsigned char[8] 分配给 uint64(c 语言),使用 RPC 传递此值,并将 uint64 转换回具有相同字节顺序的 unsigned char[8](cpp 语言)。 问题是 RPC 可能会转换我的 uint64 字节顺序。 最好的方法是什么?

虽然 endiannes 可能会改变,但您仍然可以从 uint64_t 中提取单个字节,例如:

void to_bytes(uint64_t from, char* to) {
    for(size_t i = 0; i < sizeof from; ++i, from >>= 8)
        to[i] = from & 0xff;
}

或者,使用反向复制操作:

#ifdef BOOST_LITTLE_ENDIAN

    inline void xcopy(void* dst, void const* src, size_t n)
    {
        char const* csrc = static_cast<char const*>(src);
        std::reverse_copy(csrc, csrc + n, static_cast<char*>(dst));
    }

#elif defined(BOOST_BIG_ENDIAN)

    inline void xcopy(void* dst, void const* src, size_t n)
    {
        char const* csrc = static_cast<char const*>(src);
        std::copy(csrc, csrc + n, static_cast<char*>(dst));
    }

#endif

void to_bytes(uint64_t from, char* to) {
    xcopy(to, &from, sizeof from);
}

void from_bytes(char const* from, uint64_t* to) {
    xcopy(to, from, sizeof *to);
}
unit8_t data[8];
// fill the array, then ...
uint64_t carrier = data [0];
size_t position;
for (position = 1; position < 8; ++position) {
  carrier <<= 8;
  carrier |= data[position];
}
// ... on the other end
// variables of same type
position = 8;
while (position--) {
  data[position] = 0xFF & carrier;
  carrier >>= 8;
}

应该这样做,因为 carriervalue(因此您不必担心字节顺序)将(希望)正确传输RPC 协议。 注意使用 uint8_t 而不是 char。后者不保证是 uint64_t.

的 1/8

代码应该 具有针对 C 和 C++ 的明确定义的行为。对于 C++,您应该使用 std::array 而不是原始数组。