linux网路编程:字节序(大端、小端、网络、主机)
字节序:就是数据在内存中的存放顺序,也可称之为端模式。
大端模式和小端模式的定义
1) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
2) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
3) 网络字节序:TCP/IP各层协议将字节序定义为Big-Endian,因此TCP/IP协议中使用的字节序通常称之为网络字节序
什么是高位字节,低位字节?
一般一个16位(双字节)的数据,比如 FF1A (16进制),(4位二进制用一个十六进制表示)
那么高位字节就是FF,低位是1A
如果是32位的数据,比如 3F68415B
高位字(不是字节)是3F68
低位字是415B
右边是低位,左边是高位
include <stdio.h>
#include <arpa/inet.h> int main(int argc, char *argv[])
{
unsigned int x = 0x12345678;
unsigned char* p = (unsigned char*)&x; //小端字节序
printf( "%p->%0x\n%p->%0x\n%p->%0x\n%p->%0x\n", p+, *(p+), p+, *(p+), p+, *(p+), p+, *(p+) ); printf( "---------------------\n" ); //h:主机字节序 n:网络字节序 l:long
unsigned int y = htonl( x );
p = ( unsigned char* )&y; printf( "%p->%0x\n%p->%0x\n%p->%0x\n%p->%0x\n", p+, *(p+), p+, *(p+), p+, *(p+), p+, *(p+) ); return ;
}
输出结果:
0x7fff3bb55708->78
0x7fff3bb55709->56
0x7fff3bb5570a->34
0x7fff3bb5570b->12
---------------------
0x7fff3bb5570c->12
0x7fff3bb5570d->34
0x7fff3bb5570e->56
0x7fff3bb5570f->78
第一种结果:
0x7fff3bb55708->78
0x7fff3bb55709->56
0x7fff3bb5570a->34
0x7fff3bb5570b->12
地址从08--->0b属于增长, 08这个低地址放的是78, 78这个数是低位字节, 这种情况属于低地址放低位字节,高地址放高位字节, 所以叫:小端字节序
第二种结果:
0x7fff3bb5570c->12
0x7fff3bb5570d->34
0x7fff3bb5570e->56
0x7fff3bb5570f->78
把主机字节序转换成了网络字节序, 这种情况属于低地址放高位字节,高地址放低位字节,所以叫:大端字节序
---------------------------------------------------------------------------------------------------------------------------------------------------------
字节序转换相关API:
htonl:主机字节序转换成网络字节序
inet_addr:函数原型:in_addr_t inet_addr(const char *cp)
作用:把ip地址格式转成网络字节序
unsigned int addr = inet_addr( "192.168.1.100" );
printf( "%u\n", addr );
printf( "0x%0x\n", addr );
结果:
1677830336
0x6401a8c0
这两个数是一样的
ntohl: 网络字节序转主机字节序
unsigned int haddr = ntohl( addr );
printf( "%u\n", haddr );
printf( "0x%0x\n", haddr );
inet_ntoa:网络字节序,转ip地址格式
struct in_addr ipaddr;
ipaddr.s_addr = addr;
printf( "%s\n", inet_ntoa( ipaddr ) );
linux网路编程:字节序(大端、小端、网络、主机)的更多相关文章
- C/C++字节序(大端/小端)判断
C/C++大端小端判断 说的是变量的高字节.低字节在内存地址中的排放顺序. 变量的高字节放到内存的低地址中(变量的低字节放到内存的高地址中)==>大端 变量的高字节放到内存的高地址中(变量的低字 ...
- [C++][转]CPU字节序 网络序 主机序 大端小端
原帖:http://www.cnblogs.com/darktime/p/3298075.html 不同的CPU有不同的字节序类型 这些字节序是指整数在内存中保存的顺序 这个叫做主机序最常见的有两种1 ...
- Linux网络编程--字节序
1 .谈到字节序,那么会有朋友问什么是字节序 非常easy:[比如一个16位的整数.由2个字节组成,8位为一字节,有的系统会将高字节放在内存低的地址上,有的则将低字节放在内存高的地址上,所以存在字节序 ...
- C# 中大端序与小端序
C# 中大端序与小端序 static void Main(string[] args) { uint value = 0x12345678; Console.WriteLine("原始字节序 ...
- C/C++学习笔记---高地址、低地址、大段字节序、小段字节序
字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端.大端两种字节顺序. 小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处: 大端字节序是高字节数据存放在低地址 ...
- c# 16进制大端小端解析长度
//前两个字节为长度的解析string hexstr = "00 13 59 02 80 00 E7 00 80 00 E9 00 80 00 EA 00 80 00 EB 00 80&qu ...
- 不同生产商的CPU以及大端/小端对齐
● 不同生产商的CPU以及大端/小端对齐 ※ ARM.AMD.Atom和intel之间的关系 intel公司和AMD公司生产的是相同的x86架构的CPU,这种CPU属于CISC(Complex I ...
- (转)C系程序员面试必知必会之大端小端
C程序员经常被问及的一道面试题是:什么是大端/小端,怎么样判断是大端/小端?大端小端问题对于嵌入式程序员绝对不会陌生(否则,别告诉我你是搞嵌入式的),它与CPU体系结构有关.比如常见的X86处理器 ...
- C语言内存:大端小端及判别方式
大端和小端是指数据在内存中的存储模式,它由 CPU 决定:1) 大端模式(Big-endian)是指将数据的低位(比如 1234 中的 34 就是低位)放在内存的高地址上,而数据的高位(比如 1234 ...
随机推荐
- NOIP2016提高组初赛(1)
一.选择题 6.后缀表达式,使用二叉树来求解,正常情况下的表达式a*(b+c)- d为中序遍历的二叉树. 即 若转换为后缀表达式(左右根)则为abc+*d- 14.代数字进去,多试几遍: 三.问题求解 ...
- while(true)应用 之 实现自己的消息队列
早些时候,一直有个疑问,就是比如你从前端发一个操作之后,后台为什么能够及时处理你的东西呢?当然了,我说的不是,服务器为什么能够立即接收到你的请求之类高大上的东西.而是,假设你用异步去做一个事情,而后台 ...
- Python笔记·第一章—— Python基础(一)
一.Python的简介 1.Python的由来与版本 1.1 python的由来 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆(中文 ...
- 使用FlexPaper实现在线预览
准备工作 1.下载并安装安装OpenOffice 2.下载并安装FlexPaper 3.下载jodconverter 5.下载并安装swftools 软件安装具体方式按照 这篇博客 :http://b ...
- iOS_20_微博OAuth授权_取得用户授权的accessToken
终于效果图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill ...
- 阿里巴巴2016研发project师笔试题
问题1: 假设下列的公式成立:78+78=123,则採用的是_______进制表示的. 本题实则考察进制转换.能够设为x进制.可是x进制有一个问题.即我们无法对x进制直接进行加减乘除.故转化为我们常见 ...
- JavaScript 实现命名空间(namespace)的最佳方案——兼容主流的定义类(class)的方法,兼容所有浏览器,支持用JSDuck生成文档
作者: zyl910 一.缘由 在很多的面向对象编程语言中,我们可以使用命名空间(namespace)来组织代码,避免全局变量污染.命名冲突.遗憾的是,JavaScript中并不提供对命名空间的原生支 ...
- 自学Python2.5-基本数据类型-set集合
Python set集合 一. set集合概述 ①set集合,是一个无序且不重复的元素集合.②集合对象是一组无序排列的可哈希的值,集合成员可以做字典中的键.③集合支持用in和not in操作符检查成员 ...
- 把项目放到码云上,通过git 进行项目管理
1.在码云上新建一个项目 把使用 Readme文件初始化这个项目这个勾选去掉 项目生成后会看到 码云的git 简易的命令行入门教程: Git 全局设置: git config --global us ...
- oracle如何连接别人的数据库,需要在本地添加一些配置
2.oracle如何连接别人的数据库,需要在本地添加一些配置 1.找到 listener.ora 文件,打开(一般在 C 文件夹) ORCL = (DESCRIPTION = (ADDRESS = ( ...