在终端模式和网络字节顺序的大小

一、为什么会出现大小端模式?

不同的cpu採用的大小端模式不一致。

X86是小端模式。而KEIL
C51则为大端模式。非常多的ARM。DSP都为小端模式。

有些ARM处理器还能够由硬件来选择是大端模式还是小端模式。

二、大小端模式的不同带来的问题是什么?怎样解决?

假设存在数据网络传输。假设大小端模式不一致,假设不经过转换。必定会导致数据不致,出现错误。

解决方法:统一将网络上传输的字节序採用同一种模式(大家都知道的),这样收发数据时,就会依据主机相应的模式是否和网络字节相应的模式一致,来推断是否须要进行转换。

这样即使不同的设备使用不同的模式,网络传输不会出现故障。

三、怎样推断cpu的大小端模式?

有多种方法,列举三种。

(1)、採用联合

// 返回真,就是小端

bool LittleEndian()

{

union

{

int i;

char c;

}udata;

udata.i = 1;

return (udata.c == 1);

}

(2)、通过指针推断

bool LittleEndian()

{

int d = 0x12345678;

char* p = *(char*)&d;

return (*p == 0x78);

}

(3)、在linux环境下,通过htonl等函数直接推断。

#include <arpa/inet.h>

bool LittleEndian()

{

return (1!=htonl(1));

}

四、网络字节序

因为不同的系统会有不同的模式,为了统一。规定在网络传输中使用大端模式。这就是网络字节序。如今看看以下这四个函数的作用

uint32_t htonl(uint32_t hostlong);//32位的主机字节序转换到网络字节序
uint16_t htons(uint16_t hostshort);//16位的主机字节序转换到网络字节序
uint32_t ntohl(uint32_t netlong);//32位的网络字节序转换到主机字节序
uint16_t ntohs(uint16_t netshort);//16位的网络字节序转换到主机字节序

拿htonl和ntohl来分析,htonl函数的内部实现原理是这样,先推断主机是什么模式存储,假设是大端模式,就跟网络字节序一致,直接返回參数就可以,假设是小端模式。则把形參转换成大端模式存储在一个暂时參数内,再把暂时參数返回;而ntohl函数的实现原理也是一样的过程,可是要注意它的參数,參数是网络字节序,就是大端模式存储,而无论你传入实參的过程是假设存储的。因此当推断主机是大端模式的时候。会直接返回,由于该函数默认会觉得形參是网络字节序,把它当大端模式来看。假设推断主机是小端模式,就会将实參做转换,转换的过程并不复杂,就是逆序存储各个字节的数据,所以结果就被转换。

讲到这里,能够看出一个规律来。就是假设主机与网络字节序不一致(也就是小端模式),这四个函数的返回值与传递进去的实參值的字节排序肯定是逆序的,所以返回值绝对不等于实參值。比如htonl(1)的结果肯定不是1,而假设主机与网络字节序一致(也就是大端模式),则这四个函数根本就没有做转换操作,而是直接返回实參值,这样他们的返回结果就肯定与实參值同样,即htonl(1)的结果是1。

这样,我们就得到了一个很简便的推断系统是什么模式的方法。就是直接利用这四个函数来推断。如

if (1 != htonl(1)) {
    //小端模式,作对应处理
} else {
    //大端模式,作对应处理
}

或者直接用一个推断if(1 != htonl(1))。仅仅有主机字节序与网络字节序不一致时,才调用那些函数转换,否则,不需要治疗,这可以减少额外的函数调用。

版权声明:本文博主原创文章,博客,未经同意不得转载。

时间: 2024-12-17 18:26:03

在终端模式和网络字节顺序的大小的相关文章

大端模式与小端模式、网络字节顺序与主机字节顺序

大端模式与小端模式 一.概念及详解 在各种体系的计算机中通常采用的字节存储机制主要有两种: big-endian和little-endian,即大端模式和小端模式. 先回顾两个关键词,MSB和LSB: MSB:Most Significant Bit  ------- 最高有效位     LSB:Least Significant Bit ------- 最低有效位 大端模式(big-edian) big-endian:MSB存放在最低端的地址上. 举例,双字节数0x1234以big-endia

大端模式和小端模式 网络字节顺序与主机字节顺序

在 各种计算机体系结构中,对于字节.字等的存储机制有所不同,因而引发了计算机 通信领 域中一个很重要的问题,即通信双方交流的信息单元(比特.字节.字.双字等等)应该以什么样的顺序进行传送.如果不达成一致的规则,通信双方将无法进行正 确的编/译码从而导致通信失败.目前在各种体系的计算机中通常采用的字节存储机制主要有两种:Big-Endian和Little-Endian,下面先从字节序说起.一.什么是字节序字节序,顾名思义字节的顺序,再多说两句就是大于一个字节类型的数据在内存中的存放顺序(一个字节的

每天一点Linux --- 进入终端模式

在Ubuntu图形界面之下,可以打开终端程序,然后执行各种命令. 但是,如果想体验一下终端模式,在非图形界面下工作,则: 1.按组合键Ctrl+Alt+F1 2.重新登录 3.执行各种命令 4.输入exit可退出登录 5.按Alt+F7可返回到桌面

Ubuntu启动到字符终端模式

方法1,使用tengcy的方法,永远启动到字符终端模式 要修改 "/etc/init/gdm.conf" 将第13行: "stop on runlevel [016]" 修改为: "stop on runlevel [0126]" 这样就永远启动到字符终端模式,如果想用Xwindow,则在登录后,使用startx启动即可. 方法2,一次性进入字符终端模式 在启动时,出现grub2的启动菜单时,选择要启动的Linux内核,按e编辑启动参数. rec

linux c 网络编程:用域名获取IP地址或者用IP获取域名 网络地址转换成整型 主机字符顺序与网络字节顺序的转换

用域名获取IP地址或者用IP获取域名 #include<stdio.h> #include<sys/socket.h> #include<netdb.h> int main(int argc,char **aggv) { struct hostent *host; char hostname[]="www.163.com"; char hostname2[]="www.baidu.com"; struct in_addr in;

网络字节顺序 【转】

原文 http://www.cnblogs.com/uvsjoh/archive/2012/12/24/2830822.html ● 字节序的定义字节序,顾名思义字节的顺序,再多说两句就是大于一个字节的数据在内存中的存放顺序(一个字节的数据当然就无需谈顺序的问题).在大部分的开发中我们不需要考虑字节序的问题.唯有在跨平台以及网络程序应用中字节序才是一个应该被考虑的问题. ● 网络应用的字节序网络字节序是TCP/IP规定好的一种数据表示格式,它与具体的CPU类型.操作系统无关,从而可以保证数据在不

【转】[c/c++ ]字节序与大小端转换--不错

原文网址:http://blog.csdn.net/kuai0705/article/details/20841133 注明: 以下内容均为学习内容整理,记录,便于自己学习,并非完全意义上的自产,如有感到不适,请联系我 一.多字节值及字节序 1.brief 现在有一个数字 65430,这个数字在二进制的内存中一个字节无法完全存下,存储这个数字需要1个字节以上的空间.这样的值被称为多字节量(multi-byte quantity). 65430在内存中由两个字节表示:0xFF 和 0x96 ,其中

字节序与大小端

为什么会有字节序问题 1. 内存以8bit为一个地址单位:早期的处理器地址以8bit为一个单位(8位处理器),也就是说一次可以访问8bit的数据,后来出现了16位,32位甚至64位的处理器,但为了兼容最早的8位处理器,因此沿用8bit为一个地址单位. 2. 大于8位的处理器,如32位处理器,虽然每个8bit(一个字节)存储数据的方式是一样的,但是针对整形这样的有多个字节的数据结构的数据,每个字节内存储数据方式相同,但字节间(即几个字节的顺序)存储方式不同. 3.其他历史原因. 不同的处理器结构对

开始ubuntu 14.04 的装X模式---终端模式下中文输入,听歌,上irc 开启framebuffer看电影 截图

先上图吧 卡卡的全是在tty1 下的操作,看电影,听歌,截图 ,看图  ,上irc 等等,相当适合在小白面前装屁! 需要安装的软件: 为了能正常显示中文:安装fbterm sudo apt-get install fbterm 因为ubuntu 14.04 的framebuffer 默认是开启的  是都开启 请查看 (ls /proc/|grep fb)所以不用做其他配置, 只要把用户加入video 组就可以了 否则会出现: "cann't open frame buffer device!&q