克服 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 字节序转换的主要内容,如果未能解决你的问题,请参考以下文章