大小端问题与主字节序及网络字节序(一般在x86和arm下为小端模式):
(1) 大端模式:高位存在低地址,低位存在高地址
(2) 小端模式:高位存在高地址,低位存在低地址
例如:
0x0000 0X12
0x0001 0X34
0x0002 0Xab
0x0003 0xcd
大端模式读取为:1234abcd;小端模式读取数据为:cdab3412.
而网络字节序这是TCP/IP协议中定义好的一种数据表示格式,它是与你的机器的cpu,操作系统什么的无关的,这样可以保证数据在网络中传输时,不管怎么样都能正确的解释了,网络字节序选择了Big endian。这样就给编写网络程序的程序员带来一个问题,程序员必须把本地数据从主机字节序转换成网络字节序发送到主机,同时,主机也必须把收到的数据从网络字节序转换成本地字节序,这样才能保证双方正确的收发数据,不然就是产生bug。
(1) 大端模式:高位存在低地址,低位存在高地址
(2) 小端模式:高位存在高地址,低位存在低地址
例如:
0x0000 0X12
0x0001 0X34
0x0002 0Xab
0x0003 0xcd
大端模式读取为:1234abcd;小端模式读取数据为:cdab3412.
而网络字节序这是TCP/IP协议中定义好的一种数据表示格式,它是与你的机器的cpu,操作系统什么的无关的,这样可以保证数据在网络中传输时,不管怎么样都能正确的解释了,网络字节序选择了Big endian。这样就给编写网络程序的程序员带来一个问题,程序员必须把本地数据从主机字节序转换成网络字节序发送到主机,同时,主机也必须把收到的数据从网络字节序转换成本地字节序,这样才能保证双方正确的收发数据,不然就是产生bug。
大端模式处理器的字节序到网络序不需要转换,此时ntohs(n) = n, ntohl(n) = n, 而小端模式处理器则需要转换。
现在上代码:
#include <iostream>
#include <stdio.h>
#include <netinet/in.h>
using namespace std;
typedef struct
{
char a;
char b;
short c;
int d;
}S_test;
typedef long long Int64;
int main()
{
S_test s = {3, 5, 6, 99};
S_test *p = &s;
int *i = (int*)p;
printf("%4x\n", htonl(*i));
printf("%4x\n", *(int*)p);
return 0;
}
打印结果为
3050600
60503