C ++ htonll和后面

Ale*_*eld 3 c c++

我发现以下代码能够将int64_t转换为网络字节顺序。现在,我需要相反的代码,以便将网络字节顺序转换回我的小端机器。代码是这样的。

int64_t decode(void* value){
    int64_t vv = *((int64_t*) value);
    int num = 42;
    if(*(char *)&num == 42) //test big/little endian
        return (((uint64)htonl(vv)) << 32) + htonl(vv >> 32);
    else 
        return vv;
}
Run Code Online (Sandbox Code Playgroud)

非常感谢!

Dou*_*rie 5

您的代码 htonll

#define htonll(x) ((((uint64_t)htonl(x)) << 32) + htonl((x) >> 32))
Run Code Online (Sandbox Code Playgroud)

将字节首尾翻转。如果您两次应用它,它将值恢复为原始状态。因此,相同的功能可用于ntohll。

  • 该代码有缺陷。它适用于主机和网络的字节顺序相反的情况,但是如果它们相同,则将高32位与低32位翻转。谨防! (6认同)
  • 我不是说它是“ htonll”,而是说“是为了您的” htonll”。 (3认同)
  • 好吧,当然,只有当主机和网络的字节顺序相反时,才调用此代码。请注意,OP的问题中已明确测试了主机为低字节序主机。 (2认同)