hexdump 和 hexdump -C 有什么区别,为啥输出的顺序不一样 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zhanglintc

hexdump 和 hexdump -C 有什么区别,为啥输出的顺序不一样

  •  
  •   zhanglintc 2023 年 6 月 19 日 1561 次点击
    这是一个创建于 1042 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有这样一段 C 代码,就是往文件里写入一个 int 型的 1:

    #include <unistd.h> #include <stdio.h> #include <fcntl.h> #include <string.h> #include <errno.h> int main() { const char *path = "test.pid"; int fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644); int v = 1; if (fd > 0){ write(fd, &v, sizeof(int)); } else { int error_code = errno; const char* error_message = strerror(error_code); printf("Failed to open file, reason: %s\n", error_message); } close(fd); } 

    文件生成后,分别hexdumphexdump -C查看,显示的顺序有点不一样:

     lane@vbox#2 ~ cat test.pid | hexdump -C 00000000 01 00 00 00 |....| 00000004 lane@vbox#2 ~ cat test.pid | hexdump 0000000 0001 0000 0000004 

    一个是 0100 ,一个是 0001 。为啥呢? 看起来 hexdump -C 才是文件的实际存储顺序。

    7 条回复    2023-06-19 14:12:27 +08:00
    Eiden
        1
    Eiden  
       2023 年 6 月 19 日
    adoal
        2
    adoal  
       2023 年 6 月 19 日   1
    你以为是“0100”和“0001”,再仔细看看,其实是“01 then 00”(以字节( 8 位整数)为单位,两个独立的字节,显示时 8bit 一组,每 8bit 间空格隔开)和“whole 0001”(短字,以 16 位整数为单位,把两个相邻字节看作一个短字,显示时 16bit 一组,每 16bit 间空格隔开)。如#1 所说,多字节整数的存储有大小端区别,在 X86 上用的是小端序,所以内存里的 01 then 00 的值就是 0001 。
    zhanglintc
        3
    zhanglintc  
    OP
       2023 年 6 月 19 日
    @Eiden @adoal 嗯嗯,大小端这个我知道了。

    但我的主要在意的是,是不是可以认为 hexdump 输出的是这个短字的逻辑顺序 00 01 。
    而 hexdump -C 输出的是这个短字的物理顺序 01 00 。

    man hexdump 也没有看出来明确说这个问题 。
    adoal
        4
    adoal  
       2023 年 6 月 19 日
    @zhanglintc 我已经说了,第一个是 01 then 00 ,第二个是 whole 0001 ,有空格和没空格,显示的都不一样的。你先想明白 multiple-byte integer 和 multiple bytes 的区别就明白了。

    你说你看了 man hexdump ,再仔细看看?不加格式参数时按 -x 来( If no format strings are specified, the default display is very similar to the -x output format ),-x 是--two-bytes-hex ,-C 是 Canonical hex+ASCII display ,这两个有什么区别很明显的吧。

    没有什么“逻辑顺序”、“物理顺序”,只有按不同的数据类型大小来解释。
    zhanglintc
        5
    zhanglintc  
    OP
       2023 年 6 月 19 日
    @adoal 啊,OKOK ,这回明白了。加不加空格是两种显示方法。那我懂了。
    buffzty
        6
    buffzty  
       2023 年 6 月 19 日
    你完全没必要问人,把 1 改成 0x12345678 答案就出来了
    简单的问题问人容易使自己退步
    zhanglintc
        7
    zhanglintc  
    OP
       2023 年 6 月 19 日
    @buffzty 脑子里那个弯儿没转过来之前改成这个也看不出来
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2807 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 37ms UTC 12:38 PVG 20:38 LAX 05:38 JFK 08:38
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86