目前,我正在从事一个网络项目,我正在转换长数据(64位)到大端,然后再发送到一个套接字。 为此,我使用htobe64(x)函数。 而在接收方客户端,我正在使用be64toh(x)函数将大端字节顺序转换为主机字节顺序。 这对正数(132)很好,但当数字为负数(-132)时,函数返回一些模糊的数字。 我感到困惑的是,为什么即使在我使用像上面这样的标准函数的时候,也会发生这种情况。 目前正在ubuntu(linux)机器上测试客户端和服务器。
例如,请参见下面的代码。
long a = -132;
cout << "=========" << endl;
cout << "a = " << a << endl;
cout << "htobe64 = " << htobe64(a) << endl;
long b = htobe64(a);
cout << "be64toh = " << be64toh(b) << endl;
cout << "=========" << endl;
输出为:
=========
a = -132
htobe64 = 9007199254740991999
be64toh = 18446744073709551484
=========
这对正数来说是很好的。
=========
a = 132
htobe64 = 9511602413006487552
be64toh = 132
=========
值18446744073709551484是两个补码-132的无符号64位重新表示。 =
行cout<<<; "BE64TOH="<<: be64toh(b)<<; endl;
函数BE64TOH
接受并返回BASE64_T
,因此COUT
将位序列打印为无符号。 因此,您看到的是位序列的无符号解释。 通常,有符号的数字以2的恭维方式表示(尽管它可以根据硬件的不同而不同)。 如果执行以下示例:
cout<<<; "BE64TOH="<<: (长)为64toh(b)<<; std::endl;
并将整数重新解释为正被签名(缺省情况下long是被签名的),那么您将能够看到您想要的结果。
因此,在端点转换中没有问题,这只是打印例程基于变量类型的解释方式。