쉘/bash에서 uint8 배열( javascript new Uint8Array() )을 바이너리 형식(또는 바이너리 모드?)으로 변환하시겠습니까?

쉘/bash에서 uint8 배열( javascript new Uint8Array() )을 바이너리 형식(또는 바이너리 모드?)으로 변환하시겠습니까?

문제는 new Uint8Array()자바스크립트로 생성된 파일을 일반 파일(ffmpeg와 같은 다른 프로그램에서 사용할 수 있는 파일)로 변환하는 것에 관한 것입니다.

** 바이너리 또는 다른 용어에 대해 uint8인 경우 사용해야 할 올바른 용어를 모르겠습니다...

자바 스크립트에는 ajax를 통해 보내기 위해 버퍼를 uint8로 변환하는 fileReader가 있습니다.

전송되는 것은 다음과 같은 배열입니다 23,42,69,333,99...

fopen(pack("C*", ...$uintARRAY),"wb")PHP에서는 쓰기 및 바이너리 모드를 위해 "wb"를 호출할 수 있습니다 .

최종 결과는 다음과 같은 "바이너리" 콘텐츠를 포함하는 파일입니다.

Efl££BÜÅB˜ÅBÚÅBÛÅBÇàmatroskaBáÅBÖÅSÄgˇˇˇˇˇˇˇI©fô*◊±ÉB@MÄÜChrome

Linux bash 스크립트 또는 쉘 명령에서 다음과 동등한 것은 무엇입니까?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해결하려면 인수 대신 stdin을 통해 숫자 목록을 제공할 수 있습니다.execve()

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

perl둘 다 zsh1, 2.55e2, 0xff 등과 같은 숫자를 허용합니다. 두 경우 모두 0177은 8진수가 아닌 10진수로 해석되지만 zsh를 사용하여 변경할 수 있습니다 set -o octalzeroes. 다양한 진수로 숫자나 이진수를 나타내는 zsh등 더 많은 기호를 지원합니다 .6#1230b1001

외부 유틸리티를 포크하거나 의존하지 않고 이를 수행하려면 에서 bash다음을 수행할 수 있습니다.

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

(의 경우 bash은 8진수이며 , , 등의 숫자 표현을 printf지원하지 않지만, 또는 를 사용하여 해당 문자의 값을 지정할 수 있습니다 1).01231e20b1002#100"a'a


01411 단일 바이트 문자 인코딩(ASCII 기반 시스템 의 경우)을 사용하는 로케일의 바이트 값 a또는 멀티바이트 문자 인코딩(GNU 시스템의 유니코드 코드 포인트)을 사용하는 로케일의 wchar_t 값

관련 정보