大小端存储的疑问

2021-10-20 15:00:55 +08:00
 x97bgt

基本理解是,字节(十六进制 xx )是最小的处理单位。

如果一个数字是 4 个字节,假设是0x12345678,假设通过网络传输过来后,计算机

计算机是从低电路读取数据的。上面的78 | 56 | 34 | 1278 | 56 | 34 | 12,从左往右,电位是逐渐递增的,也就是读的顺序是从左读到右。所以大端下,计算机先读数字的高位,小端下先读数字的低位。

存储数字是这样的。但有疑问:

3217 次点击
所在节点    程序员
26 条回复
x97bgt
2021-10-20 21:32:32 +08:00
@realradiolover

计算机读写的最小单位是字长( 16 位或 32 位或 64 位),每次都是接受一个字。大小端是在这个字的尺度内读写机制的不同。是这么一回事么?
x97bgt
2021-10-20 21:38:25 +08:00
@realradiolover
假设主机是 0101 1101 1010 0001,那网卡会把它变成 1011 0101 1000 0101 (每个字节内部的 bit 反置),然后送到网络上传输。你说的网卡转换 bit 序,是指这么一回事吗?

这个好像不是我所认识的大小端的定义了。。。。
x97bgt
2021-10-20 21:39:34 +08:00
上面写错了,是 0101 1101 1010 0001 -> 1011 1010 1000 0101
FACEB00K
2021-10-21 03:10:06 +08:00
Q: 小端是 34 | 12 | 78 | 56 还是 78 | 56 | 34 | 12
A: 小端是 34 12 78 56. 因为这是两个数字

Q: 大小端如何区分这两个数字
A: 因为是两个数字,所以程序里咱自己会向 buffer 中写两次啊, 收到数据的时候也应该从 buffer 中读两次

Q: 最后的问题
A: 字节流肯定是不会变的,发送什么数据接收到的就是什么数据。但你接受方要读两个字节的数据,现在你只收到一个,不也是要等到第二个收到了,才能构造出 short 类型的数据嘛

Q:什么时候会发生大小端问题
A:发送方大小端不一样,都用的 memcpy 来读写数据。实际开发的时候,定的协议里都会定某个字节是低自节还是高字节,然后可以显示地封装和显示地构造。buff[0] = num & 0xff; buff[1] = (num >> 8) & 0xff;
msg7086
2021-10-21 05:00:26 +08:00
@x97bgt 网卡应该只吃 dumb 字节流。你发送的时候要自己根据协议把数据转换成字节流,然后接收方根据协议把字节流转回来。
当然通行的做法还有一律使用网络端序(大端序),免得两端扯皮。
littlefishcc
2021-10-21 23:49:32 +08:00
我看了好多回答,感觉本质为什么产生大小端问题还是没有答出来?
我们看的书籍都说跟 CPU 有关系,CPU 处理 机器码 是没有语言,没有类型可分,他只人 0 1,更加不存在 int short long 这些所谓类型逻辑,既然跟 CPU 有关系,CPU 执行机器码时候是不关心,所以只有在机器码上一层才会有可能,所以我在上面回答说 汇编层的问题, 汇编进行的操作数才有这个问题。汇编代码也跟 CPU 厂商有关系。intel 与 IBM 汇编代码实现不一样,导致操作数在内存不一样,所以才会出现大小端问题。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/809221

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX