大小端以及主字节序和网络字节序问题

大小端问题与主字节序及网络字节序(一般在x86和arm下为小端模式):
(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值