字节序

字节序(Endian),大端(Big-Endian),小端(Little-Endian)

被刻印的时光 ゝ 提交于 2020-12-05 02:02:29
在各种计算机体系结构中,对于字节、字等的存储机制有所不同,因而引发了计算机通信领域中一个很重要的问题,即通信双方交流的信息单元(比特、字节、字、双字等等)应该以什么样的顺序进行传送。如果不达成一致的规则,通信双方将无法进行正确的编/译码从而导致通信失败。目前在各种体系的计算机中通常采用的字节存储机制主要有两种: big-edian和little-endian。 字节顺序 Endian 现代的计算机系统一般采用 字节 (Octet, 8 bit Byte)作为逻辑寻址单位。当物理单位的长度大于1个字节时,就要区分 字节顺序 (Byte Order, or Endianness )。常见的字节顺序有两种: Big Endian (High-byte first)和 Little Endian (Low-byte first),这就是表2.1中的 BE 和 LE 。Intel X86平台采用Little Endian,而PowerPC处理器则采用了Big Endian。举例来说,整型数字$ 1234ABCD 存储的时候就会有两种方式: 字节顺序 内存数据 备注 Big Endian (BE) 0xAB 0xCD 0x12 0x34 此时的0xAB被称为 most significant byte ( MSB ) Little Endian (LE) 0xCD 0xAB 0x34 0x12

UTF-8 BOM和UTF-8的区别

守給你的承諾、 提交于 2020-04-05 16:57:35
今天导入Java程序时候遇到了一些问题,查了查发现是编码的问题,在Notepad编码中把UTF-8 BOM改成UTF-8再重新编译一遍,就可以用了。 但是为啥呢,正好研究一下 BOM——Byte Order Mark,就是字节序标记 概念: 在UCS 编码中有一个叫做”ZERO WIDTH NO-BREAK SPACE“的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。 UCS规范建议我们在传输字节流前,先传输 字符”ZERO WIDTH NO-BREAK SPACE“。 如果接收者收到FEFF,就表明这个字节流是大字节序的;如果收到FFFE,就表明这个字节流是小字节序的。因此字符”ZERO WIDTH NO-BREAK SPACE“又被称作BOM。 作用 UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符” ZERO WIDTH NO-BREAK SPACE “的 UTF-8编码 是 EF BB BF 。所以如果接收者收到以 EF BB BF 开头的字节流,就知道这是 UTF-8编码 了。 所以 新建的空文件会有3字节的大小。 来源: oschina 链接: https://my.oschina.net/u/2615680/blog/3219466

很全的linux网络编程技巧

我只是一个虾纸丫 提交于 2020-03-17 03:51:39
1. LINUX 网络编程基础知识 1 1.1. TCP/IP 协议概述 1 1.2. OSI 参考模型及 TCP/IP 参考模型 1 1.3. TCP 协议 3 1.4. UDP 协议 5 1.5. 协议的选择 6 2. 网络相关概念 6 2.1. socket 概念 7 2.2. socket 类型 8 2.3. socket 信息数据结构 8 2.4. 数据存储优先顺序的转换 8 2.5. 地址格式转化 9 2.6. 名字地址转化 10 3. socket 编程 13 3.1. 使用 TCP 协议的流程图 13 3.2. 使用 UDP 协议的流程图 24 3.3. 设置套接口的选项 setsockopt 的用法 31 3.4. 单播、广播、组播(多播) 32 1. LINUX 网络编程基础知识 1.1. TCP/IP 协议概述 协议 protocol:通信双方必须遵循的规矩 由iso规定 rpc文档 osi参考模型:(应-表-会-传-网-数-物) è 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 tcp/ip模型4层: 应用层 {http超文本传输协议 ftp文件传输协议 telnet远程登录 ssh安全外壳协议 stmp简单邮件发送 pop3收邮件} 传输层 {tcp传输控制协议,udp用户数据包协议} 网络层 {ip网际互联协议 icmp网络控制消息协议

java.nio.ByteBuffer 以及flip,clear及rewind区别

假如想象 提交于 2020-03-11 10:26:02
Buffer 类 定义了一个可以线性存放primitive type数据的容器接口。Buffer主要包含了与类型(byte, char…)无关的功能。 值得注意的是 Buffer及其子类都 不是线程安全 的。 每个Buffer都有以下的属性: capacity 这个Buffer最多能放多少数据。capacity一般在buffer被创建的时候指定。 limit 在Buffer上进行的读写操作都不能越过这个下标。当写数据到buffer中时,limit一般和capacity相等,当读数据时, limit代表buffer中有效数据的长度。 position 读/写操作的当前下标。当使用buffer的相对位置进行读/写操作时,读/写会从这个下标进行,并在操作完成后, buffer会更新下标的值。 mark 一个临时存放的位置下标。调用mark()会将mark设为当前的position的值,以后调用reset()会将position属性设 置为mark的值。mark的值总是小于等于position的值,如果将position的值设的比mark小,当前的mark值会被抛弃掉。 这些属性总是满足以下条件: 0 <= mark <= position <= limit <= capacity limit和position的值除了通过limit()和position()函数来设置

一个简单的socket服务器实现

萝らか妹 提交于 2020-03-05 07:36:18
目录 什么是socket socket基本操作API函数 socket服务器的实现 附录:网络字节序与主机字节序 什么是socket socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,在网络应用程序设计时,由于TCP/IP的核心内容被封装在操作系统中,如果应用程序要使用TCP/IP,可以通过系统提供的TCP/IP的编程接口来实现,socket是操作系统抽象出一个概念,连接传输层与应用层的上层应用 如图中所示套接字(socket)是一个抽象层,继承了Linux下“万物皆文件”的思想,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合 socket基本操作API函数 1. socket()函数 函数原型及所需的头文件 #include <sys/types.h> #include <sys/socket.h> int socket(int domain, int type, int protocol); (1)作用:socket()函数用来创建一个socket描述符,socket描述符类似于普通的文件描述符,可以进行读写操作,一个socket描述符唯一指定一个socket (2)三个参数: domain:即协议域

03大端和小端(Big endian and Little endian)

寵の児 提交于 2020-03-03 15:12:50
1.大端和小端的问题 ​ 对于整型、长整型等数据类型,Big endian 认为第一个字节是最高位字节( 按照从低地址到高地址的顺序存放数据的高位字节到低位字节 ),而 Little endian 则相反,它认为第一个字节是低位字节(按照从低地址到高地址的顺序存放数据的低位字节到高位字节)。 (1)例如,假设从内存地址 0x0000 开始有以下数据: /*地址*/ 0x0000 0x0001 0x0002 0x0003 /*数据*/ 0x12 0x34 0xab 0xcd ​ 如果我们去读取一个地址为 0x0000 的四个字节变量,若字节序为 big-endian,则读出结果为 0x1234abcd;若字节序为 little-endian,则读出结果为 0xcdab3412。 (2)如果我们将 0x1234abcd 写入到以 0x0000 开始的内存中,则 Little endian 和 Big endian 模式的存放结果如下: /*地址*/ 0x0000 0x0001 0x0002 0x0003 /*big-endian*/ 0x12 0x34 0xab 0xcd /*little-endian*/ 0xcd 0xab 0x34 0x12 (3)总结:一般来说,x86 系列 CPU 都是 little-endian 的字节序,PowerPc 通常是 big-endian

C进阶 字节序问题

给你一囗甜甜゛ 提交于 2020-02-29 21:26:08
字节序问题: 小端字节序: (0a 00 00 00) 数字的低位存到内存的低地址上 小(小端字节序) 小(数字低的) 小(低地址上) 大端字节序: (00 00 00 0a) 数字的低位存在内存的高地址上 大端字节序的方式比较像日常数学一样 (千位 百位 十位 个位) 一台机器大端或者小端取决于CPU 计算机存储中大小端字节序的判定 思路: 1.将整型变量的地址进行强制转换成 char*(char*是一个字节) 2.判定截取的地址是否和低地址这端相等(相等返回1,不相等返回0) # include <stdio.h> # include <stdlib.h> //返回值是1,证明是小端字节序.返回值是0,证明是大端字节序 int IsLittleEnd ( ) { int num = 0x11113344 ; int * p = & num ; char * p2 = ( char * ) p ; if ( * p2 == 0x44 ) { return 1 ; } return 0 ; } int main ( ) { printf ( "%d\n" , IsLittleEnd ( ) ) ; system ( "pause" ) ; return 0 ; } 运行结果: 指针变量涉及的信息: 1.内存对应的地址是那个地址(指针变量中存的数字决定的) 2.这个内存对应的大小

Linux 网络编程API(一):基础

旧街凉风 提交于 2020-02-28 09:55:40
Linux网络API主要分为三大类: socket地址API socket基础API 网络信息API socket地址API 大端字节序指一个整数的高位字节存储在内存的低地址处,低位字节存储在内存的高地址处, 反之小端字节序指整数的高位字节存储在内存的高地址处,而低位字节则存储在内存的低地址处 PC大多采用小端字节序,而网络字节序为大端字节序,解决方法为:发送端要把发送的数据转化成大端字节序数据后发送,而接收端知道对方传送过来的数据是大端字节序,再将其转化为小端字节序使用 Linux提供了以下四种API来进行主机字节序和网络字节序的转换 # include <netinet/in.h> unsigned long int htonl ( unsigned long int hostlong ) ; unsigned short int htons ( unsigned short int hostshort ) ; unsigned long int ntohl ( unsigned long int netlong ) ; unsigned short int ntohs ( unsigned long int netshort ) ; htonl 表示“host to network long”,即将长整型主机字节序转化为网络字节序,反之亦然 长整型通常用来转换IP地址

网络编程模型及TCP、UDP编程设计

南笙酒味 提交于 2020-02-23 14:42:12
1.Linux网络模型 Linux网络编程--->>>socket套接字的编程 2.TCP网络模型 UDP网络模型 在创建套接字后,服务器与客户端 都得 初始化网络地址 3.网络编程 服务器端: //1.1创建socket if((sockfd = socket(AF_INET, SOCK_STREAM, 0))<0) //IPv4,用于TCP通信 {perror("socket error!");exit(-1);} //确保连接稳定性 //1.2绑定地址 /*初始化地址*/ bzero(&server_addr,sizeof(struct sockaddr_in));//清零 server_addr.sin_family = AF_INET;//协议族 server_addr.sin_addr.s_addr = htonl(INADDR_ANY); //跟随网络传输 sin_addr中的成员s_addr 任意ip地址 字节序转换 主机转换为网络字节序 server_addr.sin_port = htons(port);//端口,跟随网络传输 /*绑定地址*/ if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))<0); //要绑定的地址 地址长度 {perror("bind

大小端判断及转换

丶灬走出姿态 提交于 2020-02-23 03:37:32
计算机数据存储有两种字节优先顺序:高位字节优先(称为大端模式)和低位字节优先(称为小端模式)。 大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。 小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。 例子:对于内存中存放的数0x12345678来说 如果是采用大端模式存放的,则其真实的数是:0x12345678 如果是采用小端模式存放的,则其真实的数是:0x78563412 如果称某个系统所采用的字节序为主机字节序,则它可能是小端模式的,也可能是大端模式的。 而端口号和IP地址都是以网络字节序存储的,不是主机字节序,网络字节序都是大端模式。 要把主机字节序和网络字节序相互对应起来,需要对这两个字节存储优先顺序进行相互转化。 判断大小端代码: 大小端转换代码: //无符号整型16位 uint_16 bswap_16(uint_16 x) { return (((uint_16)(x) & 0x00ff) << 8) | \ (((uint_16)(x) & 0xff00) >> 8) ; } //无符号整型32位