我希望将未签名的char8分配给uint64 (c语言),用RPC传递这个值,并以相同的字节顺序将uint64转换回无符号char8 (cpp语言)。问题是RPC可能会转换我的uint64功能。做这件事最好的方法是什么?
发布于 2015-08-20 07:52:05
虽然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);
}
发布于 2015-08-20 07:52:49
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;
}
这应该可以做到,因为RPC协议将(希望)正确地传输值(因此您不必担心carrier
的endianness)。注意使用uint8_t
而不是char
。后者不能保证是uint64_t
的1/8。
对于C和C++,代码应该具有定义良好的行为。对于C++,您应该使用std::array
而不是原始数组。
https://stackoverflow.com/questions/32111336
复制相似问题