字节存储的大小端问题

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 打赏 收藏 转发到动态 举报
写回复
用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的值是否发生了改变?如果改变了,如何避免或纠正此错误。
  • 打赏
  • 举报
回复
述的结构,如果我从小端往大端设备上发送时,大端设备接收的数据,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

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧