Xxd

製作 xxd 折線

  • December 16, 2020

為了在 SE 上的另一篇文章中顯示包含格式化文本二進制數據的文件內容,我無法決定是否顯示 ASCII 渲染輸出或xxd輸出。

作為中間課程,我考慮了一個尊重換行符的 hexdump。

(其他)範例:

00000000:636f 6d6d 6974 2031 3933 0074 7265 6520 送出 193.tree
00000010: 3331 3439 3530 3736 3263 6561 3232 3364 314950762cea223d
00000020: 3230 6233 3931 6235 3162 3336 3463 6134 20b391b51b364ca4
00000030:3165 3636 3234 3931 **0a** 61 7574 686f 7220 1e662491 **。**作者
00000040: 4578 616d 706c 6520 5573 6572 203c 6578 範例使用者 <ex
00000050:616d 706c 6575 7365 7240 7374 6163 6b6f ampleuser@stacko
00000060: 7665 7266 6c6f 772e 636f 6d3e 2031 3439 verflow.com> 149
00000070:3831 3236 3633 3320 2b30 3230 30 **0a** 636f 8126633 +0200 **。**合作
00000080: 6d6d 6974 7465 7220 4578 616d 706c 6520 mmitter 範例
00000090: 5573 6572 203c 6578 616d 706c 6575 7365 使用者 <exampleuse
000000a0:7240 7374 6163 6b6f 7665 7266 6c6f 772e r@stackoverflow。
000000b0: 636f 6d3e 2031 3439 3831 3236 3633 3320 com> 1498126633
000000c0: 2b30 3230 30 **0a**  **0a** 69 6e69 74 **0a** +0200 **..**初始化**。**

會成為

00000000:636f 6d6d 6974 2031 3933 0074 7265 6520 送出 193.tree
00000010: 3331 3439 3530 3736 3263 6561 3232 3364 314950762cea223d
00000020: 3230 6233 3931 6235 3162 3336 3463 6134 20b391b51b364ca4
00000030:3165 3636 3234 3931 **0a** 1e662491 **。**

*00000030:* 61 7574 686f 7220 作者
00000040: 4578 616d 706c 6520 5573 6572 203c 6578 範例使用者 <ex
00000050:616d 706c 6575 7365 7240 7374 6163 6b6f ampleuser@stacko
00000060: 7665 7266 6c6f 772e 636f 6d3e 2031 3439 verflow.com> 149
00000070:3831 3236 3633 3320 2b30 3230 30 **0a** 8126633 +0200 **。**

*00000070:* 636f 公司
00000080: 6d6d 6974 7465 7220 4578 616d 706c 6520 mmitter 範例
00000090: 5573 6572 203c 6578 616d 706c 6575 7365 使用者 <exampleuse
000000a0:7240 7374 6163 6b6f 7665 7266 6c6f 772e r@stackoverflow。
000000b0: 636f 6d3e 2031 3439 3831 3236 3633 3320 com> 1498126633
000000c0: 2b30 3230 30 **0a** +0200 **。**

*000000c0:*                 **0a**                               **。**

*000000c0:* 69 6e69 74 **0a** 熱量**。**

或者

00000000:636f 6d6d 6974 2031 3933 0074 7265 6520 送出 193.tree
00000010: 3331 3439 3530 3736 3263 6561 3232 3364 314950762cea223d
00000020: 3230 6233 3931 6235 3162 3336 3463 6134 20b391b51b364ca4
00000030:3165 3636 3234 3931 **0a** 1e662491 **。**
*00000030:* 61 7574 686f 7220 作者
00000040: 4578 616d 706c 6520 5573 6572 203c 6578 範例使用者 <ex
00000050:616d 706c 6575 7365 7240 7374 6163 6b6f ampleuser@stacko
00000060: 7665 7266 6c6f 772e 636f 6d3e 2031 3439 verflow.com> 149
00000070:3831 3236 3633 3320 2b30 3230 30 **0a** 8126633 +0200 **。**
*00000070:* 636f 公司
00000080: 6d6d 6974 7465 7220 4578 616d 706c 6520 mmitter 範例
00000090: 5573 6572 203c 6578 616d 706c 6575 7365 使用者 <exampleuse
000000a0:7240 7374 6163 6b6f 7665 7266 6c6f 772e r@stackoverflow。
000000b0: 636f 6d3e 2031 3439 3831 3236 3633 3320 com> 1498126633
000000c0: 2b30 3230 30 **0a** +0200 **。**
*000000c0:*                 **0a**                               **。**
*000000c0:* 69 6e69 74 **0a** 熱量**。**

或者

00000000:636f 6d6d 6974 2031 3933 0074 7265 6520 送出 193.tree
00000010: 3331 3439 3530 3736 3263 6561 3232 3364 314950762cea223d
00000020: 3230 6233 3931 6235 3162 3336 3463 6134 20b391b51b364ca4
00000030:3165 3636 3234 3931 **0a** 1e662491 **。**
61 7574 686f 7220 作者
00000040: 4578 616d 706c 6520 5573 6572 203c 6578 範例使用者 <ex
00000050:616d 706c 6575 7365 7240 7374 6163 6b6f ampleuser@stacko
00000060: 7665 7266 6c6f 772e 636f 6d3e 2031 3439 verflow.com> 149
00000070:3831 3236 3633 3320 2b30 3230 30 **0a** 8126633 +0200 **。**
636f公司
00000080: 6d6d 6974 7465 7220 4578 616d 706c 6520 mmitter 範例
00000090: 5573 6572 203c 6578 616d 706c 6575 7365 使用者 <exampleuse
000000a0:7240 7374 6163 6b6f 7665 7266 6c6f 772e r@stackoverflow。
000000b0: 636f 6d3e 2031 3439 3831 3236 3633 3320 com> 1498126633
000000c0: 2b30 3230 30 **0a** +0200 **。**
                        **0a**                               **。**
69 6e69 74 **0a** 初始化**。**

或類似的

不完全是您要求的,但非常接近。

您的文件中有空字節(值為 0x00),這使事情變得更加複雜。我假設如果您的輸入中不存在該字節值,則這些字節可以更改為 DEL(值 0x7F 的字節)。

這是用 tr 完成的:

$ cat infile | tr '\00' '\177'

使用 xxd 處理文件後,可以恢復該更改。

執行此腳本:

#!/bin/bash

while IFS=$'\n' read line; do
   length=$((${#line}+1))
   { 
       dd if=/dev/zero bs=1 count=$((position%16)) 2>/dev/null;
       echo "$line"; 
   } |
        tr '\177' '\0' |
        xxd -o "$((16*(position/16)))" -l "$((length+position%16))"
   echo
   (( position=position+length ))
done < <(cat infile | tr '\0' '\177')

要得到:

$ ./so
00000000: 636f 6d6d 6974 2031 3933 0074 7265 6520  commit 193.tree
00000010: 3331 3439 3530 3736 3263 6561 3232 3364  314950762cea223d
00000020: 3230 6233 3931 6235 3162 3336 3463 6134  20b391b51b364ca4
00000030: 3165 3636 3234 3931 0a                   1e662491.

00000030: 0000 0000 0000 0000 0061 7574 686f 7220  .........author
00000040: 4578 616d 706c 6520 5573 6572 203c 6578  Example User <ex
00000050: 616d 706c 6575 7365 7240 7374 6163 6b6f  ampleuser@stacko
00000060: 7665 7266 6c6f 772e 636f 6d3e 2031 3439  verflow.com> 149
00000070: 3831 3236 3633 3320 2b30 3230 300a       8126633 +0200.

00000070: 0000 0000 0000 0000 0000 0000 0000 636f  ..............co
00000080: 6d6d 6974 7465 7220 4578 616d 706c 6520  mmitter Example
00000090: 5573 6572 203c 6578 616d 706c 6575 7365  User <exampleuse
000000a0: 7240 7374 6163 6b6f 7665 7266 6c6f 772e  r@stackoverflow.
000000b0: 636f 6d3e 2031 3439 3831 3236 3633 3320  com> 1498126633
000000c0: 2b30 3230 300a                           +0200.

000000c0: 0000 0000 0000 0a                        .......

000000c0: 0000 0000 0000 0069 6e69 740a            .......init.

不完全是您所要求的(由於添加了許多零),但我相信這已經足夠接近了,可以理解這個想法。

如果您想要一個沒有零的輸出,但字節位置的編號不會是 16 的倍數,請詢問腳本。

引用自:https://unix.stackexchange.com/questions/372691