我有一个 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];
}
Run Code Online (Sandbox Code Playgroud)
我最终做了以下事情:
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 */
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
如果你的环境有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
Run Code Online (Sandbox Code Playgroud)
鉴于您可能正在处理 IN6 地址,因此您应该已经拥有 ntohl 系列函数。
华泰