社区
C语言
帖子详情
字节存储的大小端问题
james_hw
2009-12-15 03:57:49
typedef struct T
{
unsigned char bit0:1;
...
unsigned char bit7:1;
}test;
上述的结构,如果我从小端往大端设备上发送时,大端设备接收的数据,bit0和小端的bit0是否一样的?
如果改成unsigned short和unsigned int呢?
因为没有大端设备,想咨询一下相关的大侠。
...全文
749
19
打赏
收藏
字节存储的大小端问题
typedef struct T { unsigned char bit0:1; ... unsigned char bit7:1; }test; 上述的结构,如果我从小端往大端设备上发送时,大端设备接收的数据,bit0和小端的bit0是否一样的? 如果改成unsigned short和unsigned int呢? 因为没有大端设备,想咨询一下相关的大侠。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
19 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
baishuiquan888
2011-09-26
打赏
举报
回复
参考 http://en.wikipedia.org/wiki/Bit_numbering
在8086(LSB 0 bit numbering)机器上定义的结构:
typedef struct T
{
unsigned char bit0:1;
...
unsigned char bit7:1;
}test;
在MSB 0 bit numbering机器上对应的定义是:
typedef struct T
{
unsigned char bit7:1;
...
unsigned char bit0:1;
}test;
二者在内存中的存储顺序都是:
|7|6|5|4|3|2|1|0|
ForestDB
2009-12-16
打赏
举报
回复
MSB和LSB的讨论中,B既可以是Byte,也可以是Bit。
如果是Byte,即是我们常说的字节序/大小端的问题,这类问题很常见,总结的说
网络上的网络序,统一是大端序,即MSB在前,而主机上的主机序,是机器相关的,
x86的为小端序,LSB在前,而其他一些CPU则是大端序。
所以在做网络应用的时候,要注意网络序和主机序,在必要的时候要调用诸如htons之类的API
进行endian的转换。
但是如果是Bit的话,也许就和LZ描述的问题有关了,个人觉得这类问题跟硬件和数字电路的设计
关系更大,而这块我是没有涉及过的,所以没太多的发言。
罗耗子
2009-12-16
打赏
举报
回复
网络发送都转为网络序发送,网络接收之后都再转为本地序,这样应该不会有问题吧!
wolffan3150
2009-12-16
打赏
举报
回复
typedef struct T
{
unsigned char bit0:1;
...
unsigned char bit7:1;
}test;
楼主理解有误。
大小端,说的是当一个对象有多个字节时的存储。
比如:
如果 sizeof( int ) 的值是4
int i = 0x11000010
且 &i 的值是 0x10000
如果是小端,地址为0x10000的字节存储的值是0x10
如果是大端,地址为0x10000的字节存储的值是0x11
单字节不存在这种问题,
james_hw
2009-12-16
打赏
举报
回复
[Quote=引用 10 楼 oldrealman 的回复:]
网络传输最好用网络字节序(大端序),接收端收到后需要转化成本地字节序,一般用宏来实现一个HTONS。本地是大端则不用变化,否则变化。
大多数的计算机都是采用四字节读写操作的。不知道你的代码又没有强制一字节对齐;一般网络传输都是这样的。你要是真真理解了大小端序就知道网络字节序和大端主机序一致,所以就不用特殊处理了。
[/Quote]
字节对齐的问题已经考虑到了,不过我真正担心如果如果大小端都使用如下接口,小端再往大端发送前ntohs,大端接收后,bit0是否还能相同?
typedef struct T
{
unsigned short bit0:10;
unsigned short bit7:6;
}test;
aozhi
2009-12-16
打赏
举报
回复
理解错误。
大小端说的是字节顺序,而不是比特顺序。
lhy
2009-12-16
打赏
举报
回复
大小端不影响字节内部,只影响字节在整数中的位置。
guzhijie1981
2009-12-16
打赏
举报
回复
我觉得LZ不必关心bit位;
比如说RS232是有这样的说法就是1个停止位,1。5个停止位 2个停止位;通常我们用1个;包括一个起始位
所以说我的9600bps;实际就是9600bit/10;960字节;为什么除以10呢;因为我们每个是1个起始位8个数据位;1个停止位;这个对于程序员来说是屏蔽的;也就是说每1秒钟;接受的接受到960个字节;起始位和停止位已经有RS232芯片去了;你读取的就是数据位;何况在协议写的时候;必然保证一个字节中的bit0先传还是bit7先传;如果LZ以前学过数字电路;应该还记得串行电路和并行电路的转换电路;
另外如果是并行传输本身就不存在这样的问题;
这个都是物理层的概念;所以如果LZ只是写代码应该不涉及到这个方面的知识;我想驱动早就做好了;
至于大小端;是在字节层面的;和这个没有任何关系;
另外说一点;其实协议并不关心实际的物理电路时如何处理数据的;比如说TCP/IP;并没有规定是以太网还是FDDI;或者是ATM;
我能够了解的就这么多;
james_hw
2009-12-16
打赏
举报
回复
[Quote=引用 14 楼 forestdb 的回复:]
MSB和LSB的讨论中,B既可以是Byte,也可以是Bit。
如果是Byte,即是我们常说的字节序/大小端的问题,这类问题很常见,总结的说
网络上的网络序,统一是大端序,即MSB在前,而主机上的主机序,是机器相关的,
x86的为小端序,LSB在前,而其他一些CPU则是大端序。
所以在做网络应用的时候,要注意网络序和主机序,在必要的时候要调用诸如htons之类的API
进行endian的转换。
但是如果是Bit的话,也许就和LZ描述的问题有关了,个人觉得这类问题跟硬件和数字电路的设计
关系更大,而这块我是没有涉及过的,所以没太多的发言。
[/Quote]
多谢forestdb,不知道有没有做过网络设备的人来说明一下
oldrealman
2009-12-15
打赏
举报
回复
网络传输最好用网络字节序(大端序),接收端收到后需要转化成本地字节序,一般用宏来实现一个HTONS。本地是大端则不用变化,否则变化。
大多数的计算机都是采用四字节读写操作的。不知道你的代码又没有强制一字节对齐;一般网络传输都是这样的。你要是真真理解了大小端序就知道网络字节序和大端主机序一致,所以就不用特殊处理了。
james_hw
2009-12-15
打赏
举报
回复
自己再顶一下
james_hw
2009-12-15
打赏
举报
回复
嗯,明白了一点,不过一个新的问题是
typedef struct T
{
unsigned short bit0:10;
unsigned short bit7:6;
}test;
上面所述是一个short型,因此从pc发往网络设备时,进行了htons转序,如果网络设备使用上述结构接收的话,bit0的值是否发生了改变?如果改变了,如何避免或纠正此错误。
猫已经找不回了
2009-12-15
打赏
举报
回复
述的结构,如果我从小端往大端设备上发送时,大端设备接收的数据,bit0和小端的bit0是否一样的?
如果改成unsigned short和unsigned int呢?
因为没有大端设备,想咨询一下相关的大侠。
你都说了是要从一个设备发往另一个设备,拿就先转成网络字节序,管它大端,小端。
phpjspasp
2009-12-15
打赏
举报
回复
楼主理解有误。
大小端,说的是当一个对象有多个字节时的存储。
比如:
如果 sizeof( int ) 的值是4
int i = 0x11000010
且 &i 的值是 0x10000
如果是小端,地址为0x10000的字节存储的值是0x10
如果是大端,地址为0x10000的字节存储的值是0x11
intel 的处理器是小端,sparc是大端,moto的可以是小端,可以是大端
guzhijie1981
2009-12-15
打赏
举报
回复
按照我的理解是不会的;
也就是说PC1到路由器同一个字节内部不会出现bit位的倒置
james_hw
2009-12-15
打赏
举报
回复
[Quote=引用 3 楼 guzhijie1981 的回复:]
LZ对大小端理解有错误吧,
大小端是就字节来说的;而不和bit有关;也就是说大小端对8bit为单位而已的;
谈到bit位就要谈到硬件了;不同的协议应该不太一样;我说的是以太网的的bit流那种;不过对于程序员来说是不用关心的;
[/Quote]
我比较关心关心的是我在pc端使用上述结构给bit0置位,然后往网路端设备发送,网络端设备使用上述结构接收,那它的bit0和我的bit0位是否一样的?
guzhijie1981
2009-12-15
打赏
举报
回复
LZ对大小端理解有错误吧,
大小端是就字节来说的;而不和bit有关;也就是说大小端对8bit为单位而已的;
谈到bit位就要谈到硬件了;不同的协议应该不太一样;我说的是以太网的的bit流那种;不过对于程序员来说是不用关心的;
james_hw
2009-12-15
打赏
举报
回复
bd
james_hw
2009-12-15
打赏
举报
回复
sf
字节
跳动Vue3框架ArcoDesign Pro整合实战:前端篇
design产品框架,前后端分离,开发项目实战。本课程分为前端+后端共计2个课程,本课属于前端部分,后端属于另外课程。后端部分:SpringBoot+SpringSecurity+Mybatisplus+MySQL+Knife4j中后台项目产品实战,包括图形...
内存的
字节
存储
大小端
问题
(一)
Big-endian和little-endian是描述排列
存储
在计算机内存里的
字节
序列的术语。 Big-endian是一种大值的一端(序列中更典型值)存在前面(在最小的
存储
地址)的顺序。Little-endian是一种小值的一端(序列中较不典型的值)
存储
在前的顺序。比如,在Big-endian的电脑中,需要两个
字节
把十六位数4F52当作4F52存在
存储
器中(如果4F存在
存储
地址1000中,比如说
图解
字节
序
大小端
、比特序
大小端
先建立几个常识: 一般机器的
字节
序
大小端
和比特序
大小端
是一致的。 人类阅读时,从左向右进行阅读,所以先看到数字的高位,最后才能看到数字的低位。所以,人类的阅读顺序,天然是大端顺序。大端顺序是更方便人类阅读和表述的顺序。比如0xfedc,我们是认为f是最高位,c是最低位;比如0b01101111,我们是将0看成是最高位,1看成是最低位。
字节
序
大小端
大端:
存储
值的高位在低地址,
存储
值的低位在高地址。比如0x01是该数字的最高
字节
,但却是
存储
在0x100,最低的地址;0x67是该数字的最小值的
字节
,
存储
大小端
(
字节
序)
存储
模式
目录 引言 大端(
字节
序)
存储
模式 小端(
字节
序)
存储
模式 用代码来判断计算机的
存储
模式 引言 一个内存单元是一个
字节
,并且对应一个地址。当
存储
多个
字节
的数据时(int,short,double.....) ,就会出现一个
问题
,高地址处存高位
字节
还是低位
字节
。于是就出现了两种
存储
模式。 大端(
字节
序)
存储
模式 数据低位放在高地址处,数据高位放低地址处。 int a=0x 00 00 00 01(两位十六进制数表示一个
字节
) 小端(
字节
序)
存储
模式 数据低位放在低地址处...
什么是“
大小端
字节
序”
存储
模式?
大端
存储
+小端
存储
,例题加详解加代码全方位解析,一文理解C语言大小
字节
序!
C语言
69,369
社区成员
243,081
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章