当前位置:首页 » 存储配置 » 数据大小端存储

数据大小端存储

发布时间: 2022-03-07 13:19:37

1. 大小端存储方式与操作系统有关吗

大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中。小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。这是两种不同的存储方式,与系统无关。具体你可以查一查它的起源,好像与《格列佛游记》有关。

2. 什么是随机存储中的大小端模式

所谓的大端模式(Big-endian),是指数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放

3. 大小端模式的简介

所谓的大端模式(Big-endian),是指数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;
例子:
0000430: e684 6c4e 0100 1800 53ef 0100 0100 0000
0000440: b484 6c4e 004e ed00 0000 0000 0100 0000
在大端模式下,前32位应该这样读: e6 84 6c 4e ( 假设int占4个字节)
记忆方法: 地址的增长顺序与值的增长顺序相同 所谓的小端模式(Little-endian),是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。
例子:
0000430: e684 6c4e 0100 1800 53ef 0100 0100 0000
0000440: b484 6c4e 004e ed00 0000 0000 0100 0000
在小端模式下,前32位应该这样读: 4e 6c 84 e6( 假设int占4个字节)
记忆方法: 地址的增长顺序与值的增长顺序相反 对于0x11223344 储存如下
下面这段代码可以用来测试一下你的编译器是大端模式还是小端模式:
short int x;
char x0,x1;
x=0x1122;
x0=((char*)&x)[0]; //低地址单元
x1=((char*)&x)[1]; //高地址单元
若x0=0x11,则是大端; 若x0=0x22,则是小端......
上面的程序还可以看出,数据寻址时,用的是低位字节的地址。 #definesw16(x)((short)((((short)(x)&(short)0x00ffU)<<8)|(((short)(x)&(short)0xff00U)>>8)))

4. 保存为二进制格式的大小端问题

这个二进制文件的确有Big Endian 和Little Endian的问题,这个与CPU指令体系有关,不过不用操心,像JPEG就是Big Endian,其编解码就都是按照这个约定来完成的,没有平台问题,也没有大小端的问题

5. ubuntu 是大端还是小端存储

不同机器内部对变量的字节存储顺序不同,有的采用大端模式(big-endian),有的采用小端模式(little-endian)。
大端模式是指高字节数据存放在低地址处,低字节数据放在高地址处。
小端模式是指低字节数据存放在低地址处,高字节数据放在高地址处。

在网络上传输数据时,由于数据传输的两端可能对应不同的硬件平台,采用的存储字节顺序也可能不一致,因此 TCP/IP 协议规定了在网络上必须采用网络字节顺序(也就是大端模式) 。
通过对大小端的存储原理分析可发现,对于 char 型数据,由于其只占一个字节,所以不存在这个问题,这也是一般情况下把数据缓冲区定义成 char 类型 的原因之一。对于 IP 地址、端口号等非 char 型数据,必须在数据发送到网络上之前将其转换成大端模式,在接收到数据之后再将其转换成符合接收端主机的存储模式。

Linux 系统为大小端模式的转换提供了 4 个函数,输入 man byteorder 命令可得函数原型:

<EM><STRONG><SPAN>#include <arpa/inet.h>

uint32_t htonl(uint32_t hostlong);

uint16_t htons(uint16_t hostshort);

uint32_t ntohl(uint32_t netlong);

uint16_t ntohs(uint16_t netshort);</SPAN>

</STRONG>

</EM>
htonl 表示 host to network long ,用于将主机 unsigned int 型数据转换成网络字节顺序;
htons 表示 host to network short ,用于将主机 unsigned short 型数据转换成网络字节顺序;
ntohl、ntohs 的功能分别与 htonl、htons 相反。

通常使用的有两种数据类型:短型(两个字节)和长型(四个字节)。
下面介绍的这些转换函数对于这两类的无符号整型变量都可以正确的转换。
如果你想将一个短型数据从主机字节顺序转换到网络字节顺序的话,有这样一个函数htnos:
它是以"h”开头的,代表“主机”;
紧跟着它的是"to",代表“转换到”;
然后是"n",代表“网络”;
最后是"s",代表“短型数据”。

你可以使用"n", "h", "to", "s", "l"的任意组合。当然,你要在可能的情况下进行组合。比如,系统是没有stolh()函数的(Short to Long Host ?)。
下面给出套接字字节转换程序的列表:
hotns()——"Host to NetWork Short",主机字节顺序转换为网络字节顺序(对无符号短型进行操作 4bytes)
htonl()——"Host to NetWork Long",主机字节顺序转换为网络字节顺序(对无符号长型进行操作 8bytes)
ntons()——"NetWork to Host short",网络字节序转换为主机字节顺序(对无符号短型进行操作 4bytes)
ntohl()——"NetWork to Host Long",网络字节顺序转换为主机字节顺序(对无符号长型进行操作 8bytes)

例如:*.sin_addr.s_addr = htonl(innaddr_any)是什么意思?
*.sin_addr.s_addr = htonl(innaddr_any)是Socket编程中用到的。
*是任意定义的一个sockaddr_in型的结构体对象sin_addr是他的一个属性,用于定义IP地址,是strcut in_addr型的,s_addr为结构体in_addr的对象,简单说就是三个结构体嵌套包装的一个包。
inaddr_any一般为内核指定的,大多数系统取0,表示任意的IP地址。
htonl()简单说是把一个本机IP转化为网络协议中规定的格式的函数,也就是所谓的大端模式或小端模式。
htons函数是将一个u_short类型的值从主机字节顺序转换为TCP/IP的网络字节顺序,原型声明如下:
u_short htons(u_short hostshort);
htonl函数是将一个u_long的值从主机字节顺序转换为TCP/IP的网络字节顺序,原型声明如下:
u_long htonl(u_long hostlong);

字节序和网络平台有关,不同的平台,字节序不同。(字节序顾名思义——字节的排列顺序)只有多于一个字节的数据类型,才有字节序的问题,比如short或者int类型。char是没有这个问题的。字节序就是在硬件里面,一般实在内存里,如何表示存储和表示这些数据类型。如果高字节放到高地址上,就是大端(big endian),如果高字节放到低地址上,就是小端模式(little endian)。

6. STC的存储方式是大端序还是小端序

大端存储
16位INT型数据和32位long型数据都是。数据的低位保存在内存的高地址中,数据的高位保存在内存的低地址中.

设备的大小端可以通过程序判断的:

uin8_t 就是51单片机上的unsigned char

uint16_t 就是51单片机上的 unsigned int

51也可以通过 #include"stdint.h" 直接使用这几种类型,C99标准新添加的头文件。

Keil应该是支持的。

//方法一
uint8_tIs_Little_endian(void)
{
uint16_ti=1;
return(*(uint8_t*)&i);
}


//方法二
uint8_tIs_Little_endian(void)
{
union
{
uint16_tbig;
uint8_tlit;
}check;
check.big=1;
returncheck.lit;
}


//方法三
staticunion
{
uint8_ta[2];
uint16_ti;
}endian={1,0};

#defineIs_Little_endian()((uint8_t)endian.i)


//上述方法摘录一个即可
//判断大小端程序
intmain()
{
if(Is_Little_endian())
{
//如果进入这里,则当前设备是小端存储
//可以在这里控制点亮一个LED,将程序编译后放入单片机执行
//printf("It'sLittle-endian");
}
else
{
//如果进入这里,则当前设备是大端存储
//可以在这里控制点亮另一个LED,将程序编译后放入单片机执行
//printf("It'sBig-endian");
}
return0;
}

7. 大小端字节序存在的意义,为什么不用一个标

因为大小端都有很多应用,cpu很多也能在这两种标准之间切换。

比如,常见的pc机是小端存储,但TCP/IP协议中数据是按照大端格式存放的,两者统一出现在pc机上,能保证运行无误。

没有必要做统一标准的工作,即使做了,也一定要兼容以前的两个标准。

8. 确定一下:一个字节内的具体存储与大小端有关吗

使用df -h命令来查看硬盘的挂载状态。 关于硬盘挂载的其它说明: 一、检测硬盘能否被识别 # fdisk -l 查找新硬盘信息,类似如下文本: Disk /dev/sdb: 36.7 GB, 36748945408 bytes 二、挂载硬盘 1、在本地硬盘中临时创建一个目录 #mkdir /opt/data/tmp1 2、挂载第二块硬盘中的一个分区/dev/sdb1到tmp1 #mount /dev/sdb1 /opt/data/tmp1 3、查看是否被挂载 # df -h 查看一下是否有类似如下文本 /dev/sdb1 3.9G 1.4G 2.3G 38% /opt/tmp/tmp1 三、卸载硬盘 #umount /dev/sdb1 df命令说明 df命令用于显示磁盘分区上的可使用的磁盘空间。默认显示单位为KB。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。 语法 df(选项)(参数) 选项 -a或--all:包含全部的文件系统; --block-size=<区块大小>:以指定的区块大小来显示区块数目; -h或--human-readable:以可读性较高的方式来显示信息; -H或--si:与-h参数相同,但在计算时是以1000 Bytes为换算单位而非1024 Bytes; -i或--inodes:显示inode的信息; -k或--kilobytes:指定区块大小为1024字节; -l或--local:仅显示本地端的文件系统; -m或--megabytes:指定区块大小为1048576字节; --no-sync:在取得磁盘使用信息前,不要执行sync指令,此为预设值; -P或--portability:使用POSIX的输出格式; --sync:在取得磁盘使用信息前,先执行sync指令; -t<文件系统类型>或--type=<文件系统类型>:仅显示指定文件系统类型的磁盘信息; -T或--print-type:显示文件系统的类型; -x<文件系统类型>或--exclude-type=<文件系统类型>:不要显示指定文件系统类型的磁盘信息; --help:显示帮助; --version:显示版本信息。 参数 文件:指定文件系统上的文件。 实例

9. 在通信中怎么解决大小端存储问题

按照字节处理即可。

http://blog.163.com/asm_c/blog/static/248203113201311711560166/

参考。

10. 数据大小端读一个字节的数据有没有区别

要看用什么方式生成文件: 小端设备用fwrite(&i32_value, sizeof(i32_value), 1, fp)存储,文件内容一样是小端。 下次如果在本机用fread读取则结果正确,换大端设备读取同一个文件结果就不对了。 编写文件系统、数据库时经常遇到这种问题。

热点内容
qq买什么不要支付密码 发布:2025-02-02 03:50:29 浏览:488
android读取视频 发布:2025-02-02 03:46:57 浏览:822
手机号序列码的密码在哪里 发布:2025-02-02 03:29:34 浏览:873
安卓怎么换回鸿蒙系统 发布:2025-02-02 03:24:35 浏览:507
完美国际邻水镇箱子密码是多少 发布:2025-02-02 03:17:04 浏览:619
测试java程序 发布:2025-02-02 03:16:49 浏览:890
android罗升阳 发布:2025-02-02 03:15:01 浏览:824
javascript编程语言 发布:2025-02-02 03:05:49 浏览:361
用电账号初始密码多少 发布:2025-02-02 03:04:03 浏览:110
python赋值运算符 发布:2025-02-02 03:00:51 浏览:906