问题是关于将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 octalzeroes
。zsh
支持更多符号,例如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
基于a
ASCII 的系统)或使用多字节字符编码的语言环境中的 wchar_t 值(GNU 系统上的 Unicode 代码点)