在 shell / bash 中將 uint8 數組(javascript new Uint8Array())轉換為二進制格式(或二進制模式?)?
問題是關於
new Uint8Array()
從 javascript 生成的轉換為普通文件(可與 ffmpeg 等其他程序一起使用的文件)** 如果它是 uint8 到二進製或其他一些術語,我不知道使用正確的術語…
在 javascript 中,我有一個 fileReader 緩衝區轉換為 uint8 以通過 ajax 發送…
發送的是這樣的數組
23,42,69,333,99
…在 PHP 中,我可以
fopen(pack("C*", ...$uintARRAY),"wb")
為寫入和二進制模式呼叫“wb”……最終結果是一個包含這種“二進制”內容的文件:
Efl££BÜÅB˜ÅBÚÅBÛÅBÇàmatroskaBáÅBÖÅSÄgˇˇˇˇˇˇˇI©fô*◊±ÉB@MÄÜChrome
在 linux bash 腳本或 shell 命令中,什麼是等效的
pack("C*", ...$uintARRAY)
你會做這樣的事情:
values=(1 2 255) perl -e 'print pack "C*", @ARGV' -- "${values[@]}"
(或與 的等價物
php -r
)。列印具有這些值的字節。
請注意,大多數係統對傳遞給命令的參數的數量和大小都有限制。
如果切換到
zsh
是一個選項,你可以這樣做:set +o multibyte printf %s ${(#)values}
由於
printf
是內置的,它不受上述限制的影響。使用
bash
+perl
來解決execve()
參數數量的限制,您可以通過標準輸入而不是參數提供數字列表:(( ${#values[@]} )) && printf '%s\n' "${values[@]}" | perl -ne 'printf "%c", $_'
兩者都
perl
將zsh
接受數字,例如 1、2.55e2、0xff。對於這兩種情況,0177 都被解釋為十進制,而不是八進制,儘管在 zsh 中可以使用set -o octalzeroes
.zsh
支持更多的符號,例如6#123
以不同的基數表示數字或0b1001
二進制。要在不分叉或不依賴外部實用程序的情況下執行此操作,在 中
bash
,您可以執行以下操作:printf -v format '\\%o' "${values[@]}" printf "$format"
(對於
bash
’sprintf
,是八進制數,不支持 , , 等數字表示形式。或者0123
可以用來指定相應字元的值¹)。1e2``0b100``2#100``"a``'a
¹ 使用單字節字元編碼的語言環境中的字節值(因此
0141
在a
基於 ASCII 的系統上)或使用多字節字元編碼的語言環境中的 wchar_t 值(GNU 系統上的 Unicode 程式碼點)