Bash

在 shell / bash 中將 uint8 數組(javascript new Uint8Array())轉換為二進制格式(或二進制模式?)?

  • April 17, 2022

問題是關於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", $_'

兩者都perlzsh接受數字,例如 1、2.55e2、0xff。對於這兩種情況,0177 都被解釋為十進制,而不是八進制,儘管在 zsh 中可以使用set -o octalzeroes. zsh支持更多的符號,例如6#123以不同的基數表示數字或0b1001二進制。

要在不分叉或不依賴外部實用程序的情況下執行此操作,在 中bash,您可以執行以下操作:

printf -v format '\\%o' "${values[@]}"
printf "$format"

(對於bash’s printf,是八進制數,不支持 , , 等數字表示形式。或者0123可以用來指定相應字元的值¹)。1e2``0b100``2#100``"a``'a


¹ 使用單字節字元編碼的語言環境中的字節值(因此0141a基於 ASCII 的系統上)或使用多字節字元編碼的語言環境中的 wchar_t 值(GNU 系統上的 Unicode 程式碼點)

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