首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >克服rpc endianness转换

克服rpc endianness转换
EN

Stack Overflow用户
提问于 2015-08-20 06:48:48
回答 2查看 167关注 0票数 2

我希望将未签名的char8分配给uint64 (c语言),用RPC传递这个值,并以相同的字节顺序将uint64转换回无符号char8 (cpp语言)。问题是RPC可能会转换我的uint64功能。做这件事最好的方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-20 07:52:05

虽然endiannes可能会发生变化,但仍然可以从uint64_t中可移植地提取单个字节,例如:

代码语言:javascript
运行
复制
void to_bytes(uint64_t from, char* to) {
    for(size_t i = 0; i < sizeof from; ++i, from >>= 8)
        to[i] = from & 0xff;
}

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

代码语言:javascript
运行
复制
#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);
}
票数 1
EN

Stack Overflow用户

发布于 2015-08-20 07:52:49

代码语言:javascript
运行
复制
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而不是原始数组。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32111336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档