【发布时间】:2017-01-03 13:30:52
【问题描述】:
我正在将代码从 Big Endian Machine 重写为 Little Endian Machine。
假设有一个名为a的变量,它是一个保存当前时间戳(用户请求的当前时间戳)的32位整数。
在 Big Endian 机器中,现在的代码是这样的:
uint32 a = current_timestamp_of_user_request;
uint8 arr[3] = {0};
arr[0] = ((a >> (8 * 2)) & 0x000000FF);
arr[1] = ((a >> (8 * 1)) & 0x000000FF);
arr[2] = ((a >> (8 * 0)) & 0x000000FF);
现在,当我为小端机器编写相同的逻辑时,我可以使用相同的代码(方法a),还是应该这样转换代码(我们称之为方法b)?
uint32 a = current_timestamp_of_user_request;
uint32 b = htonl(a);
uint8 arr[3] = {0};
arr[0] = ((b >> (8 * 2)) & 0x000000FF);
arr[1] = ((b >> (8 * 1)) & 0x000000FF);
arr[2] = ((b >> (8 * 0)) & 0x000000FF);
我写了这个程序来验证:
#include<stdio.h>
#include<stdlib.h>
void main() {
long int a = 3265973637;
long int b = 0;
int arr[3] = {0,0,0};
arr[0] = ((a >> (8 * 2)) & 0x000000FF);
arr[1] = ((a >> (8 * 1)) & 0x000000FF);
arr[2] = ((a >> (8 * 0)) & 0x000000FF);
printf("arr[0] = %d\t arr[1] = %d\t arr[2] = %d\n", arr[0], arr[1], arr[2]);
b = htonl(a);
arr[0] = ((b >> (8 * 2)) & 0x000000FF);
arr[1] = ((b >> (8 * 1)) & 0x000000FF);
arr[2] = ((b >> (8 * 0)) & 0x000000FF);
printf("After htonl:\n");
printf("arr[0] = %d\t arr[1] = %d\t arr[2] = %d\n", arr[0], arr[1], arr[2]);
}
结果:
Result with little endian machine:
bgl-srtg-lnx11: /scratch/nnandiga/test>./x86
arr[0] = 170 arr[1] = 205 arr[2] = 133
After htonl:
arr[0] = 205 arr[1] = 170 arr[2] = 194
Result with big endian machine:
arr[0] = 170 arr[1] = 205 arr[2] = 133
After htonl:
arr[0] = 170 arr[1] = 205 arr[2] = 133
看起来没有转换为大端顺序,相同的逻辑(没有htonl())在填充数组arr 时给出了准确的结果。现在,如果我希望数组在小端和大端机器中相同(小端结果应该与大端结果完全相同),您能否回答我是否应该使用htonl()。
【问题讨论】:
-
如果目标是将时间戳的最低有效字节放入
arr[2],那么两台机器上的代码应该相同。代码中的移位和屏蔽操作不依赖于字节序。
标签: c++ c endianness