克服 rpc 字节序转换

Posted

技术标签:

【中文标题】克服 rpc 字节序转换【英文标题】:overcome rpc endianness convert 【发布时间】:2015-08-20 06:48:48 【问题描述】:

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

【问题讨论】:

不能直接发送char数组而不是转换吗? 不,我无法更改 RPC 协议 :( 您使用的是哪种协议?通常,RPC 协议应该能够发送任何必要的数据。 我知道我可以使用此协议发送数组,但我需要使用 uint64 字段才能传递此数据。 为什么?为什么需要将其传递为uint64?当它显然不是?为什么不能使用uchar[8]?您正在使用众多 RPC 实现中的哪一个? 【参考方案1】:

虽然字节序可能会改变,但您仍然可以从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);

【讨论】:

【参考方案2】:
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;

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

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

【讨论】:

以上是关于克服 rpc 字节序转换的主要内容,如果未能解决你的问题,请参考以下文章

c# 主机和网络字节序的转换 关于网络字节序和主机字节序的转换

主机字节序和网络字节序转换

网络字节序与主机字节序的转换

网络字节序与主机字节序的转换

网络字节序与主机字节序的转换

第五篇:主机字节序与网络字节序的转换