我有一个 unsigned char 数组,它表示网络字节顺序中的 128 位数字。我将如何有效地将其转换为主机字节顺序(在本例中为 x86_64)?

endian.h 中似乎没有任何可用的宏,我尝试独立转换高 64 位和低 64 位的尝试没有奏效。我发现唯一有效的方法是这样的循环:

unsigned __int128 num = 0;
for (int i = 0; i < 16; i++) {
    num = (num << 8) | byte[i];
}

我最终做了以下事情:
union {
    unsigned char b[MD5_DIGEST_LENGTH];
    uint64_t d[2];
    unsigned __int128 q;
} digest;
MD5((const unsigned char *)str, length, digest.b);
uint64_t tmp = digest.d[0];
digest.d[0] = be64toh(digest.d[1]);
digest.d[1] = be64toh(tmp);
/* digest.q is now in native byte order */

最佳答案

union _128_as_32 {
    unsigned __int128 v;
    unsigned __int32 d[4];
} u1, u2;
u1.v = num;
u2.d[3] = ntohl(u1.d[0]);
u2.d[2] = ntohl(u1.d[1]);
u2.d[1] = ntohl(u1.d[2]);
u2.d[0] = ntohl(u1.d[3]);
// do something with u2.v

如果你的环境有 betoh64/be64toh (linux/bsd endian.h),可以使用
union _128_as_64 {
    unsigned __int128 v;
    unsigned __int64 q[2];
} u1, u2;
u1.v = num;
u2.q[1] = betoh64(u1.q[0]);
u2.q[0] = betoh64(u1.q[1]);
// do something with u2.v

看到您可能正在处理 IN6 地址,您应该已经可以使用 ntohl 系列函数。

H.T.H.

关于c - 如何更改 128 位数字的字节顺序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8004790/

10-11 20:54