Data

用於二進製到八度/十六進制格式的數據操作的命令?

  • June 29, 2015

當我將一個 1GB 的大文件拆分為包含 777 個事件的文件時,我需要將二進制數據轉換為十六進制/八度音/任何合適的格式並返回二進制,每個事件的大小不同,因此每個事件都由fafafafahexdump 中的字元串分隔格式(但請注意,telnet-examples 中可能不存在此分隔符,因此您可以在那裡選擇任何字元串進行練習)。我試圖了解這些命令中的哪些適合於此,受此答案的啟發

下面的數據源,telnet 的二進制,只是一個例子。我故意使用偽級別來評論輸出,而不是用細節混淆你;我有標題及其部分的完整文件,但對於這項任務,他們的理解不是必需的。

從 - v

od -v /usr/bin/telnet | head
0000000 042577 043114 000402 000001 000000 000000 000000 000000
0000020 000003 000076 000001 000000 054700 000000 000000 000000
0000040 000100 000000 000000 000000 073210 000001 000000 000000
0000060 000000 000000 000100 000070 000010 000100 000034 000033
0000100 000006 000000 000005 000000 000100 000000 000000 000000
0000120 000100 000000 000000 000000 000100 000000 000000 000000
0000140 000700 000000 000000 000000 000700 000000 000000 000000
0000160 000010 000000 000000 000000 000003 000000 000004 000000
0000200 001000 000000 000000 000000 001000 000000 000000 000000
0000220 001000 000000 000000 000000 000034 000000 000000 000000

評論

  • 第一個字元串應該是一些標題,但奇怪的是它們從 2、4、6、10,…… 所以我認為這可能是以後的限制

十六進制轉儲 -v

hexdump -v /usr/bin/telnet | head
0000000 457f 464c 0102 0001 0000 0000 0000 0000
0000010 0003 003e 0001 0000 59c0 0000 0000 0000
0000020 0040 0000 0000 0000 7688 0001 0000 0000
0000030 0000 0000 0040 0038 0008 0040 001c 001b
0000040 0006 0000 0005 0000 0040 0000 0000 0000
0000050 0040 0000 0000 0000 0040 0000 0000 0000
0000060 01c0 0000 0000 0000 01c0 0000 0000 0000
0000070 0008 0000 0000 0000 0003 0000 0004 0000
0000080 0200 0000 0000 0000 0200 0000 0000 0000
0000090 0200 0000 0000 0000 001c 0000 0000 0000

評論

  • 第一個字元串的編號確定
  • 之間的一些字母可能是以後的可讀性問題
  • 第一個字元串的大小與後面的四個字母組合不同

十六進制轉儲-vb

hexdump -vb /usr/bin/telnet | head
0000000 177 105 114 106 002 001 001 000 000 000 000 000 000 000 000 000
0000010 003 000 076 000 001 000 000 000 300 131 000 000 000 000 000 000
0000020 100 000 000 000 000 000 000 000 210 166 001 000 000 000 000 000
0000030 000 000 000 000 100 000 070 000 010 000 100 000 034 000 033 000
0000040 006 000 000 000 005 000 000 000 100 000 000 000 000 000 000 000
0000050 100 000 000 000 000 000 000 000 100 000 000 000 000 000 000 000
0000060 300 001 000 000 000 000 000 000 300 001 000 000 000 000 000 000
0000070 010 000 000 000 000 000 000 000 003 000 000 000 004 000 000 000
0000080 000 002 000 000 000 000 000 000 000 002 000 000 000 000 000 000
0000090 000 002 000 000 000 000 000 000 034 000 000 000 000 000 000 000

命令od -v給了我六個字母字元串000000 042577,我認為這是一個八度格式。另一個命令hexdump -v也給了我四個字母的字元串,例如457f 464c,但帶有一些八度音階選項hexdump -vo會給出三個字母的單詞,例如000000 177 105 ....

這些命令中的哪一個適用於二進制數據的數據操作,例如使拆分變得容易?

此處討論的 1GB 二進制測試數據由以下人員創建

dd if=/dev/urandom of=sample.bin bs=64M count=16

按字節位置拆分

請在此處查看有關此的主題。如果字節偏移量是固定的,我認為這是進行拆分的最合適方法。您需要確定前兩個事件標頭的位置併計算事件的大小。還要考慮最後一個事件標頭的尾部,以便您知道何時結束拆分。

xxd

答案在 FloHimself 的評論中。

xxd -ps sample.bin | process | xxd -ps -r

從 -v

od -v中,應該根據 StephenKitt 的評論指定如下輸出格式

od -v -t x1 sample.bin

給予

0334260    00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00
0334300    00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00
0334320    00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00
0334340    00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00
0334360    00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00
0334400    00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00
0334420    00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00
0334440    00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00
0334460    00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00
0334500    00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00
0334520    00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00
0334540

這更容易處理。

關於通過 Ascii 通道而不是 hex/octave 的評論

我認為從二進制轉換為十六進制再轉換回二進制就足夠了xxd -ps。我做到了base64 sample.bin | less -s -M +Gg,但我注意到處理速度明顯變慢,輸出看起來像這樣

CGgUAMA0GCSqGSIb3DQEBAQUABIIBABR2EFj76BigPN + jzlGvk9g3rYrHiPKNIjKGprJMaB91ATT6gc0Rs3xlEr6Ybzm8NVcxMnR + 2chto / oSh85ExuH4Lk8mELHOIZLeAUUr8eFAXKnZ4SBZ6a8Ewr0x / zX09Bp6IMk18bdVUCT15PT2fbluvJfj7htWCDy0ewm + eU2LIJgkriK8AA0oarqjjK / CIhfglQutfN6QDEp4zqc6tJVqUO7XrEsFlGDOgcPTzeWJuWx31 / 8MrvEn5HcPzhq + nMI1D6NYjzGhHN08 // ObF3z3zthlCDVmowbV161i2LhQ0jy9a / TNyAM0juCR0IF9j7zSyFW0 / vvMZYdt5kg1J1EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

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