二进制中点(.)为何存在不同表示?技术问询
为什么汇编/目标文件里的点(.)二进制表示不一样?
嗨,这个问题问得很有意思!核心原因其实是你看到的那些"点"根本不是同一个东西——它们来自文件里不同类型的内容,二进制编码自然不一样,咱们拆开说:
两种"点"的本质区别
你贴的xxd -b输出里,出现的点分两类:
- 真正的ASCII字符
.:比如汇编代码里的.text、.file这些指令里的点,它的二进制是固定的00101110(对应十进制ASCII码46)。你看第一行输出里的00101110,就是这个真正的.字符的二进制,右侧列里对应的也是.。 - xxd的占位符"点":第四行开头的
..glob里的前一个点,其实是xxd用来替代不可打印ASCII字符的视觉符号。这些位置的二进制并不是.的编码,而是像换行符(00001010)、制表符(00001001)这类无法在终端显示的字符,xxd为了让输出整洁,就把它们统一显示成.,但它们的二进制和真正的.完全不同。
对应到你的输出片段验证
拿你给的例子看:
- 第一行
00000006里的00101110→ 这是真正的.字符,右侧列显示.,匹配得上; - 第四行
00000018的前两个二进制是00001001和00101110:00001001是制表符(ASCII码9),属于不可打印字符,所以xxd在右侧列显示成.;00101110才是真正的.字符,右侧列也显示.;
这就导致你看到两个连续的.,但它们的二进制完全不同——一个是制表符的编码,一个是.本身的编码。
一句话总结
你看到的"不同二进制的点",一个是真的.字符,一个是xxd用来代替不可打印字符的伪装.,本质不是同一个东西,所以二进制自然不一样~
内容的提问来源于stack exchange,提问作者Abdelrahman Emam
相关产品推荐
相关产品推荐

