读取二进制坐标时字节序和位翻转有什么区别:机制分析第19例
两个字节组成一个数时,先来的字节是高位还是低位,会改变数值。把每个字节内部的位倒过来,又是另一种操作,不能把它与交换两个字节混为一谈。
先明确输入与规则
本例把十六位无符号值拆成高字节和低字节。大端流按高低排列,小端流按低高排列;读取时分别按对应权重重组。另算逐字节位反转,以及整个十六位序列反转,作为不同变换的对照。
本例的独立记录
九个十六位模式独立解析,字节流用十六进制显示,变换结果和有符号解释用十进制显示。
原数 | 大端字节 | 小端字节 | 错序读取 | 每字节反位 | 整字反位 | 补码解释 0 | 00 00 | 00 00 | 0 | 0 | 0 | 0 65535 | FF FF | FF FF | 65535 | 65535 | 65535 | -1 5729 | 16 61 | 61 16 | 24854 | 26758 | 34408 | 5729 63623 | F8 87 | 87 F8 | 34808 | 8161 | 57631 | -1913 19294 | 4B 5E | 5E 4B | 24139 | 53882 | 31442 | 19294 64476 | FB DC | DC FB | 56571 | 57147 | 15327 | -1060 48880 | BE F0 | F0 BE | 61630 | 32015 | 3965 | -16656 10657 | 29 A1 | A1 29 | 41257 | 38021 | 34196 | 10657 55187 | D7 93 | 93 D7 | 37847 | 60361 | 51691 | -10349
记录中的编号只用来区分本例对象,不应与大小排名或另一组记录的身份混淆。先核对单位和边界,再跟随中间值检查结果。空结果、零值与尚未确定是不同状态;分数保留精确含义,显示小数只为方便阅读。
怎样复算
使用正确字节序重组应回到原数。把大端流当小端读取等于交换字节权重,但不是自动反转每字节的八个位。完整十六位反转则同时改变字节位置和各字节内部位序。
先把每个字节写成恰好八位二进制,保留前导零再翻转。对反转结果再反转一次应回到原始模式,这是一个方便的检查。显示的十六进制文字只是数值表示,不能把文字字符顺序直接当作内存里的字节布局。
适用条件与限制
这里用一个明确的无符号整数模型;若同样的十六位模式按二进制补码解释为有符号值,大于等于三万二千七百六十八的值需减六万五千五百三十六。实际文件还可能有字段宽度与对齐约定,不能只猜字节序。
练习时可以一次只改变一个条件,比较差异从哪个步骤开始。若自己的结果不同,先核对是否采用同样的规则,再定位第一个不一致的中间状态,不要只修改最终答案。输入与运算过程需要一起保存,才能判断结论究竟适用于哪一个具体场景。
