用BASH產生NUL byte, byte 1, byte2的資料

用BASH產生NUL,1,2的檔案

會有這個需求主要是需要在資料前端,尾端加入一些padding,tailing bytes,產生這些資料之後可以用cat將他們與產生的檔案做結合,達成完全以BASH處理的效果。

雖然看起來很簡單,不過有一些小陷阱

前置

因為是產生byte資料,所以會需要可以印出byte資料的指令hexdump來協助,後面都會用hexdump來協助印出byte的16進位資料,我先前的筆記在這裡

首要想法

最先想到的處理這個需求的方法就是echo ,不過馬上就被打臉,右方顯示ASCII,直接呼叫echo會給一般的字串而不是跳脫過的結果。

$ echo  "\01" > 1.txt
$ hexdump -C 1.txt
00000000  5c 30 31 0a                                       |\01.|
00000004

應該要是byte資料

查了下echo用法是用-e來套用跳脫字元的規則,我們可以看到確實就是有變成01,但是後面來個0a是怎麼回事?

$ echo -e "\01" > 1.txt
$ hexdump -C 1.txt
00000000  01 0a

處理掉0a

再查一下0a是什麼字元,看ASCII字元的wiki 得知是換行鍵Line feed

二進位 16進位 縮寫 名稱
0000 1010 0A LF 換行鍵

看來就是echo預設會多加換行的機制導致,再查一下man就是要再加-n要他別印LF

$ echo -en "\01" > 1.txt
$ hexdump -C 1.txt
00000000  01

好拉,大功告成。

結案

用BASH產生NUL byte, byte 1, byte2的資料只需要用下面這幾行

echo -en "\00" > 0.txt
echo -en "\01" > 1.txt
echo -en "\02" > 2.txt

其他

另外,要產生NUL byte, byte 1, byte2的資料也可以透過printf處理

printf "\00" > 0.txt
printf "\01" > 1.txt
printf "\02" > 2.txt

而對於NUL還可以用/dev/zero來產生

dd bs=1 count=1 < /dev/zero > 0.txt

留言