十六进制转储

科技工作者之家 2020-11-17

在计算中,十六进制转储是计算机数据的十六进制视图(在屏幕或纸上),来自RAM或来自文件或存储设备。 查看十六进制数据转储通常是作为调试或逆向工程的一部分完成的。在十六进制转储中,每个字节(8位)表示为两位十六进制数。 十六进制转储通常被组织成8或16字节的行,有时由空格分隔。 一些十六进制转储在开头具有十六进制存储器地址和/或在每一行的末尾具有校验和字节。虽然名称暗示使用base-16输出,但某些十六进制转储软件可能具有base-8(八进制)或base-10(十进制)输出的选项。 这个程序函数的一些常用名称是hexdump,od,xxd和简单转储甚至是D.1

样例程序的部分十六进制转储示例,由Unix程序hexdump生成:

00105e0 e6b0 343b 9c74 0804 e7bc 0804 e7d5 0804 00105f0 e7e4 0804 e6b0 0804 e7f0 0804 e7ff 0804 0010600 e80b 0804 e81a 0804 e6b0 0804 e6b0 0804但是,上面的示例表示十六进制转储的模糊形式,因为字节顺序可能不确定。 这样的十六进制转储仅在众所周知的字节顺序标准的上下文中有用,或者当有意地以完整形式给出值时(并且可能导致可变的字节数),例如:

00105e0 e6 b008 04e79e08 04e7bc 08 04 e7 d50804当需要显式字节序列时(例如,对于机器代码程序或ROM内容的十六进制转储),逐字节表示是有利的,通常以16字节行组织,在8字节组之间具有可选的分频器:

00105e0 e6 b0 08 04 e7 9e 08 04-e7 bc 08 04 e7 d5 08 04 00105f0 e7 e4 08 04 e6 b0 08 04-e7 f0 08 04 e7 ff 08 04 0010600 e8 0b 08 04 e8 1a 08 04-e6 b0 08 04 e6 b0 08 04很少使用精简形式,值之间没有空格:

00105e0 e6b00804e79e0804e7bc0804e7d50804 00105f0 e7e40804e6b00804e7f00804e7ff0804 0010600 e80b0804e81a0804e6b00804e6b00804在现代x86(小端)计算机上,Unix默认显示与两字节字相同的字节通常如下所示:

00105e0 b0e6 0408 9ee7 0408 bce7 0408 d5e7 0408 00105f0 e4e7 0408 b0e6 0408 f0e7 0408 ffe7 0408 0010600 0be8 0408 1ae8 0408 b0e6 0408 b0e6 0408通常,附加列显示相应的ASCII文本转换(例如hexdump -C或hd):

0000: 57 69 6B 69 70 65 64 69 61 2C 20 74 68 65 20 66 Wikipedia, the f0010: 72 65 65 20 65 6E 63 79 63 6C 6F 70 65 64 69 61 ree encyclopedia0020: 20 74 68 61 74 20 61 6E 79 6F 6E 65 20 63 61 6E that anyone can0030: 20 65 64 69 74 00 00 00 00 00 00 00 00 00 00 00 edit...........校验当十六进制转储打算手动输入计算机时,例如家用计算机时代的打印杂志文章的情况,每行末尾将添加校验和字节(或两个),通常计算为简单的256模数 行中所有值的总和或更复杂的CRC。 此校验和将用于确定用户是否正确输入行。

各种十六进制转储文件格式(包括S-record,Intel HEX和Tektronix扩展HEX)在每行末尾都有类似的校验和值。1872590

压缩重复的行在Unix程序od和hexdump中,并未显示包含与前一行相同数据的所有显示输出行; 相反,显示只包含一个星号的行。 例如,一个全零的块打印为:

0000000 0000 0000 0000 0000 0000 0000 0000 0000 * 0000030此压缩功能为检查大型文件或完整设备的不规则性提供了有用的工具。 在现代Linux系统中,扫描整个硬盘以检查它是否全部为空是很方便的:

hexdump /dev/sda (replace sda with the proper name for the device to be scanned)-v选项让hexdump和od显式显示所有输入数据:

0000000 0000 0000 0000 0000 0000 0000 0000 0000 0000010 0000 0000 0000 0000 0000 0000 0000 0000 0000020 0000 0000 0000 0000 0000 0000 0000 0000od和hexdump在Unix/POSIX/GNU系统上:“实用程序od和hexdump从文件或流输出八进制,十六进制或其他编码的字节。根据您的系统类型,这两个实用程序中的任何一个或两个都可用 - BSD系统弃用 对于hexdump,GNU系统反过来。但是,两个实用程序具有完全相同的目的,只是略有不同的开关。

DUMP和DDT和DEBUG在早期个人计算机上使用的CP/M 8位操作系统中,标准DUMP程序将列出每行16字节的文件,行的开头是十六进制偏移量,最后是每个字节的ASCII等效值。超出标准可打印ASCII字符范围(20到7E)的字节将显示为可视对齐的单个周期。在标准CP/M调试器DDT中调用D命令时,使用相同的格式显示内存。后来的格式化身(例如在DOS调试器DEBUG中)将第8个字节和第9个字节之间的空格更改为破折号而不改变整体宽度。

此表示法已保留在直接或间接源自CP/M的操作系统中,包括DR-DOS,MS-DOS,OS/2和MS-Windows。在Linux系统上,命令hexcat也会生成这种经典输出格式。设计这种格式的主要原因是它适合标准80字符宽屏幕或打印机上的最大数据量,同时仍然非常容易阅读和浏览。

1234:0000: 57 69 6B 69 70 65 64 69 61 2C 20 74 68 65 20 66 Wikipedia, the f1234:0010: 72 65 65 20 65 6E 63 79 63 6C 6F 70 65 64 69 61 ree encyclopedia1234:0020: 20 74 68 61 74 20 61 6E 79 6F 6E 65 20 63 61 6E that anyone can1234:0030: 20 65 64 69 74 00 00 00 00 00 00 00 00 00 00 00 edit...........本词条内容贡献者为:

王沛 - 副教授、副研究员 - 中国科学院工程热物理研究所

科技工作者之家

科技工作者之家APP是专注科技人才,知识分享与人才交流的服务平台。