字节序

网络通信大端小端转换

最后都变了- 提交于 2019-12-18 01:52:20
1、 使用说明 大端又叫网络字节序,小端又叫主机字节序,在网络通信传输数据时候,通常是采用大端对齐方式,而在本机电脑中存储是小端对齐方式,像一些网络传输协议:RTP,在构造RTP头时候就需要转换为大端对齐方式。 2、看图详解大端小端 3、如何转换 在Linux系统下:htonl(),htons(), ntohl(), ntohs()的头文件及函数定义如下: #include <arpa/inet.h> / 常用函数: h:host to: 转换为 n:network l:long类型 s:short类型 / uint32_t htonl(uint32_t hostlong); uint16_t htons(uint16_t hostshort); uint32_t ntohl(uint32_t netlong); uint16_t ntohs(uint16_t netshort); 注意: 只有数据类型超过1个字节以上的数据才需要进行转换 4、使用代码 # include <stdio.h> # include <arpa/inet.h> int main ( ) { long iSmallData = 0x12345678 ; long iBigData ; iBigData = htonl ( iSmallData ) ; //小端转大端(主机字节序转网络字节序) printf

linux hexdump使用

笑着哭i 提交于 2019-12-16 14:44:32
# hexdump -h hexdump: invalid option -- 'h' Usage: hexdump [options] file... Options: -b one-byte octal display#单字节八进制显示 -c one-byte character display#单字节字符显示 -C canonical hex+ASCII display#规范化 十六进制+ASCII 显示 -d two-byte decimal display#两字节十进制显示 -o two-byte octal display#两字节八进制显示 -x two-byte hexadecimal display#两字节十六进制显示 -e format format string to be used for displaying data#格式 用于显示数据的格式字符串 -f format_file file that contains format strings#格式文件 包含格式字符串的文件 -n length interpret only length bytes of input#长度 只解释输入的指定长度个字节 -s offset skip offset bytes from the beginning#偏移 跳过开头指定长度个字节 -v display

变量在内存中存储的位置

随声附和 提交于 2019-12-11 09:19:11
存储区域 内存存储区域主要分为一下几块区域: ├———————┤低端内存区域 │ …… │堆栈区域 ├———————┤ │ 动态数据区 (自由存储区)│ ├———————┤ │ …… │ ├———————┤ │ 代码区 │ ├———————┤ │ 静态数据区 │ ├———————┤ │ …… │ ├———————┤高端内存区域 1. *栈区域* :由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2. *堆区域* :由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。在堆中存放空闲内存地址链表,申请的时候是去遍历链表获取地址的,所以地址与地址之间可能不连续. 3. *自由(动态)存储区* :由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。 4. *静态(全局)存储区* :全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 程序结束后由系统释放。 5. *常量存储区* :这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改. 6. *程序代码区* :存放函数体中的二进制代码 端模式 端模式

Linux Socket编程(不限Linux)

丶灬走出姿态 提交于 2019-12-10 19:53:47
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> “一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket。 ——有感于实际编程和开源项目研究。 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket?那什么是socket?socket的类型有哪些?还有socket的基本函数,这些都是本文想介绍的。本文的主要内容如下: 1、网络中进程之间如何通信? 2、Socket是什么? 3、socket的基本操作 3.1、socket()函数 3.2、bind()函数 3.3、listen()、connect()函数 3.4、accept()函数 3.5、read()、write()函数等 3.6、close()函数 4、socket中TCP的三次握手建立连接详解 5、socket中TCP的四次握手释放连接详解 6、一个例子(实践一下) 7、留下一个问题,欢迎大家回帖回答!!! 1、网络中进程之间如何通信? 本地的进程间通信(IPC)有很多种方式,但可以总结为下面4类: 消息传递(管道、FIFO、消息队列) 同步(互斥量、条件变量、读写锁、文件和写记录锁、信号量) 共享内存

UTF8 与 UTF8 +BOM 区别

房东的猫 提交于 2019-12-09 11:01:12
一个带标签,一个没有标签。 BOM是Byte Order Mark(定义字节顺序),因为在网络传输中分两种顺序:大头和小头。 由于兼容性,带BOM的utf-8在一些browser中显示为乱码。 网上搜索了关于Byte Order Mark的信息: 在UCS 编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建 议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这 个字节流是Little- Endian的。因此字符"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编码了。 Windows就是使用BOM来标记文本文件的编码方式的。 带BOM的UTF-8,所有PHP无法识别,直接将EF BB BF输出,在charset="utf-8"的页面中是空白

字节序 —— Big Endian 和 Little Endian

隐身守侯 提交于 2019-12-08 00:36:24
一、字节序 字节序指的是多字节的数据在内存中的存放顺序 内存有高地址端与低地址端。其中,低地址端既可以存放高位字节,也可以存放低位字节。 Big Endian 是指低地址端 存放 高位字节。 Little Endian 是指低地址端 存放 低位字节。 二、为什么要注意字节序 如果你写的程序只在单机环境下面运行,并且不和别人的程序打交道,那么你完全可以忽略字节序的存在。 但是,如果你的程序要跟别人的程序产生交互呢? 比如,当一个 C/C++ 的程序要与一个 Java 程序交互时: C/C++语言编写的程序里数据存储顺序是跟编译平台所在的CPU相关的,而现在比较普遍的 x86 处理器是 Little Endian JAVA编写的程序则唯一采用 Big Endian 方式来存储数据 试想,如果你的C/C++程序将变量 a = 0x12345678 的首地址传递给了Java程序,由于Java采取 Big Endian 方式存储数据,很自然的它会将你的数据翻译为 0x78563412 。显然,问题就出现了!!! 另外,网络传输一般采用 Big Endian,也被称之为 网络字节序 ,或 网络序 。当两台采用不同字节序的主机通信时,在发送数据之前都必须经过字节序的转换成为网络字节序后再进行传输。 三、网络序与主机序 网络字节序 :TCP/IP各层协议将字节序定义为 Big Endian

系统平台大小端问题

守給你的承諾、 提交于 2019-12-07 11:08:48
Internet上的数据以 大端方式 在网络上传输!!! 常见CPU及大小端 CPU 操作系统 字节顺序 x86 (Intel、AMD等) 所有 little-endian DEC Alpha 所有 little-endian HP-PA NT little-endian HP-PA UNIX big-endian SUN SPARC 所有 big-endian MIPS NT little-endian MIPS UNIX big-endian PowerPC NT little-endian PowerPC 非NT big-endian RS/6000 UNIX big-endian Motorola m68k 所有 big-endian Socket编程中经常采用第二种方法。整个传输过程如下: 发送端将本机的数据转换成网络的字节顺序(调用API函数htonl或 htons ),然后发送;接收端收到网络数据后,先将数据转换成本机的字节顺序(调用API函数ntohl或 ntohs ),然后再进行其它操作——如此就能保证“会议精神”在通信双方的正确传达了! 这个过程中用到的几个API函数:ntohl、htonl、 ntohs 、 htons ,名字都差不多,很难区分。但是如果知道了它们的来历,问题也就不存在了:n是network,网络的意思;h是host,本地主机的意思。

大小字节序的深入理解和鉴定系统字节序方法

蓝咒 提交于 2019-12-07 11:08:13
最近在项目中的soket通信时,遇到了大小字节序问题和网络传输时的字节序问题,现在给大家整理一下,希望大家对字节序有个比较深入的了解,其实理解了就很简单的。 开始遇到的问题: 1、本地的数据通过网络传输然后在目的地解析网络上的数据,字节序是如何统一的 2、字节序不同,数据(如0xFF00)存入内存地址中位置不同(大字节序:FF--低地址位 00--高地址位 ;小字节序: 00--低地址位 FF--高地址位),为什么读出的值都是0xFF00 下面让我们带着问题来理解: 大字节序:大端有效 ,高位数据先放入低地址内存 , 低位数据放入高地址内存 小字节序:小端有效,低位数据先放入低地址内存 , 高位数据再放入高地址内存 注意:描述的是将数据(肉眼看到的)放入内存中的地址(计算机的硬盘内存中) 然后看一下图示吧: 相信大家对遇到的第二个问题已经知道结果了吧,现在再来看看第一个问题。 网络字节序:是大字节序,在把数据进行网络传输时,要保证自己传输到网络上的数据时大字节序。 再来看看图示吧: 1号线路:发数据和接收数据都 不需要 转序,因为自己是和网络都是大字节序 2号线路: 发数据和接收数据 都 需要 转序,因为自己是小字节序,网络都是大字节序,才能保证自己本系统的数据永远都是小字节序。可能高级语言(java、C#屏蔽了字节序,大家感受不到,那是因为高级语言内存进行封装和处理了)。

大端小端(Big- Endian和Little-Endian)

柔情痞子 提交于 2019-12-07 11:07:51
字节序(Endian),大端(Big-Endian),小端(Little-Endian) 图文并茂 http://www.cppblog.com/tx7do/archive/2009/01/06/71276.html 在各种计算机体系结构中,对于字节、字等的存储机制有所不同,因而引发了计算机通信领 域中一个很重要的问题,即通信双方交流的信息单元(比特、字节、字、双字等等)应该以什么样的顺序进行传送。如果不达成一致的规则,通信双方将无法进行正 确的编/译码从而导致通信失败。目前在各种体系的计算机中通常采用的字节存储机制主要有两种:Big-Endian和Little-Endian,下面先 从字节序说起。 一、 什么是字节序 字节序,顾名思义字节的顺序,再多说两句就是大于一个字节类型的数据在内存中的存放顺序(一个字节的数据当然就无需谈顺序的问题了) 。 其实大部分人在实际的开 发中都很少会直接和字节序打交道。唯有 在跨平台以及网络程序中字节序才是一个应该被考虑的问题。 在所有的介绍字节序的文章中都会提到字 节序分为两类:Big-Endian和Little-Endian,引用标准的Big-Endian和Little-Endian的定义如下: a) Little-Endian就是 低位字节排放在内存的低地址端,高位字节排放在内存的高地址端 。 b) Big-Endian就是

字节序和大小端

心已入冬 提交于 2019-12-06 19:32:19
<div class="Section0"> <h2>1. 字节顺序</h2> <p class="p0"><strong>字节顺序(Endian) </strong></p> <p class="p0">字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序。</p> <p class="p0">  计算机系统一般采用字节<span style="font-family: 'Times New Roman'">(Byte</span>(8 bit ))<span style="font-family: 宋体">作为逻辑寻址单位。当物理单位的长度大于</span><span style="font-family: 'Times New Roman'">1</span><span style="font-family: 宋体">个字节时,就要区分字节顺序</span><span style="font-family: 'Times New Roman'">(Byte Order</span>)<span style="font-family: 宋体">。常见的字节顺序有两种:</span><span style="font-family: 'Times New Roman'">Big Endian(High-byte first)</span><span style=