2011-04-07 137 views
13

我的問題是,我需要建立與此完全相同字節的文件:48,00,49,00寫在外殼的二進制文件(殼,AWK)

我不能使用C(因爲我不能部署任何東西,沒有perl的,沒有其他的腳本語言,這個我試過用awk,並在桌面上它的工作:

[email protected]:~# awk 'BEGIN{ printf "%c%c%c%c", 48, 00, 49, 00 }' | hexdump 
0000000 0030 0031        
0000004 

但是目標平臺運行BusyBox的v1.13.2這個代碼在這裏是行不通的AWK版本沒有輸出ascii「0」(所有其他值都可以)

什麼是您的推薦mendations?

回答

20

您可以使用下面的命令:

echo -n -e \\x48\\x00\\x49\\x00 > myfile 
5

你可以嘗試回聲,也允許任意ascii字符(這些數字是八進制數字)。

echo -n -e \\0060\\0000\\0061\\0000 | hexdump 
+0

...和十六進制。 。?這可能嗎? – elcuco 2011-04-07 14:51:18

+0

不,回聲只接受八進制數。但是你問了一個特定的十六進制序列(我甚至將它們翻譯成八進制)。如果您不確定如何在ascii的手冊頁中查找不同的十六進制序列。它會給你一個有十進制,十六進制和八進制數字的表格;-)。 – flolo 2011-04-07 14:54:25

+0

僅供將來參考,它確實接受十六進制。只需使用\\ xNN,其中N是一個十六進制數字。 – Velocibadgery 2017-08-11 15:06:39

1

我不知道什麼是在busybox,但這可能工作,因爲printf比awk小。

$ printf "%c%c%c%c" 48 0 49 0 | hexdump 

這是輸出:

$ printf "%c" 1 | hexdump 
0000000 0031      
+1

我用我所看到的編輯了你的答案,這不是我所問的。這會打印0x31,它是字符「1」的ASCII值。 – elcuco 2011-04-07 14:50:48

+0

所以如果你用H和I代替1,你得到的值是0x48,你想要的是0x49--而不是十進制的48/49(使用0和1)。有問題的部分是獲取零字節不終止輸出。上面然後轉換爲'printf'%c%c%c%c「72 0 73 0 | hexdump'輸出0x48 0x00 0x49 0x00。 – starturtle 2016-06-08 06:46:18

5

POSIX AWK標準說傳遞一個0到AWK與%C格式的printf會導致在未指定的行爲。但是... POSIX回聲也非常有限,雖然八進制和十六進制說明符(和-n)可用於GNU回顯和BASH內置...它們可能無法在任何地方工作。要最大限度地提高在所有POSIX系統上獲得一致行爲的機會,最好使用shell命令行的printf而不是其中的任何一個。

$ printf '\060\000\061\000' | od -An -tx1 
30 00 31 00 

這看起來奇怪,我雖然......你可能會想輸出0x48,0x00時,×49,0×00 - 它看起來像一個漂亮的飛行員數量在八進制:

$ printf '\110\000\111\000' | od -An -tx1 
48 00 49 00 
3

我需要在老的Android shell中使用busybox從十六進制編寫二進制文件。這個printf在我的用例中有一個重定向。

寫的二進制數據(十六進制)

# busybox printf '\x74\x65\x73\x74' > /sdcard/test.txt 

結果顯示在十六進制:

# busybox hexdump -C /sdcard/test.txt 
00000000 74 65 73 74          |test| 
00000004 

結果顯示在ASCII:

# cat /sdcard/test.txt 
test 
+0

爲什麼你需要使用'dd'?爲什麼不會'busybox printf'\ x74 \ x65 \ x73 \ x74'>/sdcard/test.txt'工作? – 2016-07-19 00:45:15

+0

哇,你是對的!我確信我嘗試過。我確實嘗試了所有這些答案,還有十幾個人都失敗了。這很簡單。組合中一定有其他變量。我會修改我的答案。謝謝! – BuvinJ 2016-07-19 12:41:46