字节序

大小端

六月ゝ 毕业季﹏ 提交于 2020-02-19 18:05:44
https://www.cnblogs.com/linux-bfbdxj520/p/11706973.html 存储模式: 小端:较高的有效字节存储在较高的存储器地址,较低的有效字节存储在较低的存储器地址。 大端:较高的有效字节存储在较低的存储器地址,较低的有效字节存储在较高的存储器地址。 STM32 属于小端模式,简单地说:比如:temp=0X12345678;假设temp的地址为:0X4000 0000 那么,在内存里面,其存储就变成了: | 地址 | HEX | |0X4000 0000 |78 56 43 12| 更为简单一点: 低地址---------->高地址【大端模式】: 0X12|0X34|0X56|0X78| 低地址---------->高地址【小端模式】: 0X78|0X56|0X34|0X12| 大端与小端的优势 二者无所谓优势,无所谓劣势,各自优势便是对方劣势 大端模式:符号位的判定固定为第一个字节,容易判断正负。 小端模式:强制转换数据不需要调整字节内容,1、2、4字节的存储方式一样 数组在大端小端情况下的存储: 以unsigned int value = 0x12345678为例, 分别看看在两种字节序下其存储情况, 我们可以用unsigned char buf[4]来表示value: Big-Endian: 低地址存放高位,如下: 高地址 ------

网络字节序与主机字节序

做~自己de王妃 提交于 2020-02-12 08:56:08
不同的CPU有不同的字节序类型 这些字节序是指整数在内存中保存的顺序 这个叫做主机序 最常见的有两种 1. Little endian:将低序字节存储在起始地址 2. Big endian:将高序字节存储在起始地址 LE little-endian 最符合人的思维的字节序 地址低位存储值的低位 地址高位存储值的高位 怎么讲是最符合人的思维的字节序,是因为从人的第一观感来说 低位值小,就应该放在内存地址小的地方,也即内存地址低位 反之,高位值就应该放在内存地址大的地方,也即内存地址高位 BE big-endian 最直观的字节序 地址低位存储值的高位 地址高位存储值的低位 为什么说直观,不要考虑对应关系 只需要把内存地址从左到右按照由低到高的顺序写出 把值按照通常的高位到低位的顺序写出 两者对照,一个字节一个字节的填充进去 例子:在内存中双字0x01020304(DWORD)的存储方式 内存地址 4000 4001 4002 4003 LE 04 03 02 01 BE 01 02 03 04 例子:如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为 big-endian little-endian 0x0000 0x12 0xcd 0x0001 0x23 0xab 0x0002 0xab 0x34 0x0003 0xcd 0x12

linux网络编程之socket编程(一)

梦想的初衷 提交于 2020-02-12 08:44:17
今天开始,继续来学习linux编程,这次主要是研究下linux下的网络编程,而网络编程中最基本的需从socket编程开始,下面正式开始学习: 什么是socket: 在学习套接口之前,先要回顾一下Tcp/Ip四层模型: 而在说明什么是Socket之前,需要理解下面这些图: 而实际上: 所以: 另外: 这跟管道是不同的,管道只能用于本机的进程间通信。另外socket能用于异构系统间进行通信: IPv4套接口地址结构: 一般不用 为什么要有地址家族呢?因为Socket不仅仅只能用于Tcp/Ip协议,还能用于其它协议,如:Unix域协议,所以一定得指名是哪个家族,如果是IPv4协议,则需要指定为AF_INET,如果是AF_INET6,则就是IPv6协议,这个用得很少~ 16位的无符号整数,也就是两个字节,它能表示的最大的整数为:65535 对于IPv4协议,地址是32位的,也就是四个字节,所以该结构体为无符号的32位整数: 实际上,也可以通过man帮助来看到其结构:man 7 ip 【注意】 :平常编程时,只会用到 sa_family_t、in_port_t、struct in_addr 这三个字段。 通用 地址结构: 该字段总共有14个字节,实际上跟sockaddr_in最后面三个字段的总和是一样大小的: 所以说,通用的地址结构可以兼容IPv4的结构 为什么要有通用地址结构呢?

socket那些事

放肆的年华 提交于 2020-02-06 04:42:54
数据发到网络环境通常通过交换机,再由交换机转发至路由器 但凡提到套接字,必定有两端:数据的发送端和接收端, ip地址在网络环境中可以唯一的表示一台主机,ip+端口号可以在网络环境中唯一标识一个进程。 socket通信原理: 套接字是linux操作系统中的一种文件类型----伪文件 linux中有7种文件类型:其中普通文件,目录文件,软链接三种文件类型占用内存,字符设备,块设备,管道,套接字 管道,fd[0]读端,fd[1]写端,半双工,如同对讲机 socket乃是双向全双工,一个文件描述符,两个缓冲区(一个读,一个写) 对于数字8910.67 低地址存高位----大端法按照内存地址顺序由近及远依次存入8,9,1,0,.6.7 低地址存低位----小端法(与上边相反)x86就是如此,小端法存储,源于windows基于Intel x86平台 理论上是这样,不同操作系统可能不尽相同。 网络数据流采用了大端字节序,操作系统采用了小端法存储,这样一来网卡发送的数据字节序发生了变化,这样一来,接收端在解包的过程中无法正确解析IP地址等关键信息,这就需要能转换网络字节序和主机字节序的系列函数 uint32_t htonl(uint32_t hostlong) uint16_t htons(uint16_t hostshort) uint32_t ntohl(uint32_t netlong)

最简单的Tcp Udp的例子

岁酱吖の 提交于 2020-02-05 11:25:15
//1.WinSock包含2个主要的版本,即WinSock1和WinSock2.前者需要包含头文件WinSock.h和库文件wsock32.lib,后者需要包含头文件WinSock2.h和库文件ws2_32.lib用于提供对网络相关API的支持。 //2.WSAData结构体的定义 typedef struct WSAData { WORD wVersion; WORD wHighVersion; #ifdef _WIN64 unsigned short iMaxSockets; unsigned short iMaxUdpDg; char FAR * lpVendorInfo; char szDescription[WSADESCRIPTION_LEN+1]; char szSystemStatus[WSASYS_STATUS_LEN+1]; #else char szDescription[WSADESCRIPTION_LEN+1]; char szSystemStatus[WSASYS_STATUS_LEN+1]; unsigned short iMaxSockets; unsigned short iMaxUdpDg; char FAR * lpVendorInfo; #endif } WSADATA, FAR * LPWSADATA; //3.MAKEWORD()

理解字节序---大端小端

喜你入骨 提交于 2020-02-01 15:34:45
本篇将以what,why,how三个维度讲述字节序 what 字节序,字面理解可知是字节(Byte)的顺序,是计算机科学针对多字节结构(变量或者文件等)的一种 约定 ,目前分为 大端字节序 和 小端字节序 以一个 uint32_t 的4字节类型为例,在该类型的变量中存入0x12345678,从变量的角度来看,0x12为变量的高字节,0x78为变量的低字节。 当变量的 高 字节存放在内存的 高 地址,变量的 低 字节存放在内存的 低 地址时,为 小端字节序, 如下图: 当变量的 高 字节存放在内存的 低 地址,变量的 低 字节存放在内存的 高 地址时,为 大端字节序, 如下图: why 定义只是约定,当然可以直接记忆,但是为什么要这么约定?为什么要分成两种字节序?有什么好处? 两种字节序针对两类对象, 大端字节序 面向的是 人类 , 小端字节序 面向的是 计算机 。 大端字节序符合人类阅读的习惯,对字节流的处理也是按照阅读习惯来定义,这样能减少人类的处理负担,因此如网络字节序用的就是大端字节序,当网络socket传输一个多位数时,按照阅读习惯,接收到的是高字节数,因此直接左移8位相加。 小端字节序符合计算机处理的顺序 1.计算机读取数据不关心格式,仅按照内存地址顺序读取 2.计算机处理数据从数据低位开始处理,这个也是计算机设计定义的,因此我们需要把变量低地址的数据主动放到内存低地址处

c++堆,栈的存储方式及代码内存分配

天大地大妈咪最大 提交于 2020-01-31 22:32:25
使用对象指针 C语言中经典的指针在 C++ 中仍然广泛使用,尤其是指向对象的指针,没有它就不能实现某些功能。 Student stu ; Student * pStu = & stu ; 上面代码中创建的对象 stu 在栈上分配内存,需要使用&获取它的地址,例如: Student stu;Student *pStu = &stu; pStu 是一个指针,它指向 Student 类型的数据,也就是通过 Student 创建出来的对象。 当然,你也可以在堆上创建对象,这个时候就需要使用前面讲到的new关键字(C++ new和delete运算符简介),例如: Student *pStu = new Student; 在栈上创建出来的对象都有一个名字,比如 stu,使用指针指向它不是必须的。但是通过 new 创建出来的对象就不一样了,它在堆上分配内存,没有名字,只能得到一个指向它的指针,所以必须使用一个指针变量来接收这个指针,否则以后再也无法找到这个对象了,更没有办法使用它。也就是说,使用 new 在堆上创建出来的对象是匿名的,没法直接使用,必须要用一个指针指向它,再借助指针来访问它的成员变量或成员函数。 栈内存是程序自动管理的,不能使用 delete 删除在栈上创建的对象;堆内存由程序员管理,对象使用完毕后可以通过 delete 删除。在实际开发中,new 和 delete 往往成对出现

写一个程序判断当前机器的字节序是大端还是小端

混江龙づ霸主 提交于 2020-01-31 08:33:58
文章目录 前提知识 大小端 union 解答 参考资料 前提知识 我的实验平台是x86_64的Ubuntu 本文涉及到计算机字节的大小端表示 大小端 假设有一个int变量的值是0x01000002,它在内存中的起始位置是0x00000000 我们称0x01000002, 右边是低位,左边是高位 那么大端字节序的存储结构是这样的,上面一行是地址,下面一行是值 小端字节序的存储结构是这样的 也就是,当计算机采用小端字节序的时候,要从高地址(0x00000003)往低地址(0x00000000)读才能读出正确的值0x01000002 而采用大端字节序的时候,要从低地址往高地址读。换而言之,小端存储是, 低地址保存的是整数的低位 (这里的低位是指02开始,到高位01);大端存储时,低地址存储的是整数的高位。 union 平常用的比较多的结构是C的struct,但是C还有一个结构叫做union,最开始是为了节约内存而设计的结构,当然还有更小的结构叫做Bit Filed,这些类型会在这篇文章详细介绍: https://blog.csdn.net/hhmy77/article/details/104114080 C中union有一个特点, 联合(union)变量的所有成员共享同一块存储区/内存 ,因此联合变量每个时刻里只能保存它的某一个成员的值。就是因为这个特点,

外部排序,杀鸡焉用牛刀?

北城余情 提交于 2020-01-25 17:45:27
上篇: http://www.cnblogs.com/foreach-break/p/external_sort.html 字符集和编码 字节序 I/O方式 内存 磁盘 线程/同步/异步 数据特点 字符集和编码 为什么要考虑文件的编码? 当你将文件从阿拉伯传到中国,告诉你的中国朋友要进行一个外部排序,你的中国朋友也许会傻: 上面是什么? 乱码 . 你也可以这样体验乱码: echo "数" > t.txt iconv -f UTF-8 -t UNICODE t.txt ��pe 好了,你知道了如果不知道文件的编码,你可能会解析到乱码. 字符集是什么? charset - > char-set,字符的集合.比如 UNICODE、ASCII 编码是什么? encoding,字符的表示.比如 UTF-8、ASCII 字符集和编码的关系 你晕了,我也晕了,ASCII码怎么既是字符集又是编码? 历史上,字符集和编码是同义词,实际却又不尽相同,没有一个规范地定义,那怎么理解呢? 字符集,往往强调其所“支持”的字符范围,集外的字符它不支持.集合就有一个边界,边界内的我给个表示,边界外的我不知道怎么表示。 编码,往往强调针对某个字符集的字符,我这么去转换表达为机器可理解的方式-二进制,如果对某个字符集的字符,我的转换方式和其一致,那么我既是编码也是字符集,否则我就只是一种字符集的转换格式。 那么

socket网络编程快速上手(一)

回眸只為那壹抹淺笑 提交于 2020-01-23 05:35:18
工作以来,写了很多socket相关的代码。磕磕碰碰,走了很多弯路,也积累了一些东西,今天正好整理一下。为了证明不是从书上抄来的,逻辑会有点乱(借口,呵呵)!知识点的介绍也不会像书上说的那么详细和精准,毕竟个人水平也就这样了。当然,主要还是以上手为主,不过分剖析原理性内容。一些陌生的函数要用到的头文件,使用man查看一下就能解决了。既然该文的名称为“快速上手”,那个人认为下述内容都不存在水分,都是必须要掌握的,一点都不能急躁! 一、socket连接流程: 对于程序员来说,开始的时候只会把socket编程当成一个工具,尽快上手,尽快解决战斗。于是乎最关心的就是socket那些函数的调用顺序,那就先给出UDP/TCP的流程图(从《UNIX网络编程》)吧: 有了流程图,再找一些资料,就很容易写出下面这样的代码(以TCP为例): 服务器程序: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <unistd.h> 5 #include <sys/types.h> 6 #include <sys/socket.h> 7 #include <netinet/in.h> 8 #include <arpa/inet.h> 9 10 #define PORT 1234 11 #define