在 shell / bash 中将 uint8 数组( javascript new Uint8Array() )转换为二进制格式(或二进制模式?)?

在 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)

答案1

你会做类似的事情:

values=(1 2 255)
perl -e 'print pack "C*", @ARGV' -- "${values[@]}"

(或与 等效php -r)。

打印具有这些值的字节。

请注意,大多数系统对传递给命令的参数的数量和大小都有限制。

如果可以选择切换到zsh,您可以这样做:

set +o multibyte
printf %s ${(#)values}

由于printf是内置的,它不受上述限制的影响。

使用bash+perl来解决execve()参数数量的限制,您可以通过 stdin 而不是参数提供数字列表:

(( ${#values[@]} )) && printf '%s\n' "${values[@]}" |
  perl -ne 'printf "%c", $_'

perl和都zsh接受 1、2.55e2、0xff 等数字。对于两者来说,0177 被解释为十进制,而不是八进制,尽管在 zsh 中可以使用 进行更改set -o octalzeroeszsh支持更多符号,例如6#123以不同基数表示数字或0b1001二进制。

要在不分叉也不依赖外部实用程序的情况下完成此操作,在 中bash,您可以执行以下操作:

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

(对于bash's printf,是八进制,不支持0123诸如1e2, 0b100,之类的数字表示形式,但是可以使用 or 来指定相应字符的值1)。2#100"a'a


1 使用单字节字符编码的语言环境中的字节值(对于0141基于aASCII 的系统)或使用多字节字符编码的语言环境中的 wchar_t 值(GNU 系统上的 Unicode 代码点)

相关内容