私の問題は、この正確なバイトでファイルを作成する必要があることです:48, 00, 49, 00
。
C、Perl、その他のスクリプト言語を使用できません(ターゲットは組み込みデバイスです)。私はawkを使用してこれを試しましたが、デスクトップでは機能します:
# awk 'BEGIN{ printf "%c%c%c%c", 48, 00, 49, 00 }' | hexdump
0000000 0030 0031
0000004
ただし、ターゲットプラットフォームはbusybox v1.13.2を実行しており、このコードはそこで機能しません。 awkバージョンでは、ASCII "0"は出力されません(他のすべての値は問題ありません)。
あなたのおすすめは何ですか?
次のコマンドを使用できます。
echo -n -e \\x48\\x00\\x49\\x00 > myfile
POSIX AWK標準では、%c形式で0をAWKのprintfに渡すと、不特定の動作が発生する可能性があると述べています。ただし... POSIXエコーも非常に制限されており、8進数および16進数の指定子(および-n)はGNUエコーおよびBASHビルトインで機能しますが...どこでも機能しない場合があります。すべてのPOSIXシステムで一貫した動作が得られる可能性を最大化するには、これらのどちらよりもシェルコマンドラインのprintfを使用することをお勧めします。
$ printf '\060\000\061\000' | od -An -tx1
30 00 31 00
これは私には奇妙に見えます...あなたは0x48、0x00、0x49、0x00を出力したいと思うかもしれません-これは8進数でかなりパイロット番号のように見えます:
$ printf '\110\000\111\000' | od -An -tx1
48 00 49 00
エコーを試すこともできます。これは任意のASCII文字を許可します(これらの数字は8進数です)。
echo -n -e \\0060\\0000\\0061\\0000 | hexdump
古いAndroidシェル内でbusyboxを使用してバイナリファイルを16進数から書き込む必要がありました。このprintf
リダイレクトを使用すると、私のユースケースで機能しました。
バイナリデータを16進数で書き込みます。
# busybox printf '\x74\x65\x73\x74' > /sdcard/test.txt
結果を16進数で表示します。
# busybox hexdump -C /sdcard/test.txt
00000000 74 65 73 74 |test|
00000004
結果をASCIIで表示します。
# cat /sdcard/test.txt
test
整数を出力する、より一般的な2つの関数:
le16 () { # little endian 16 bit binary output 1st param: integer to 2nd param: file
v=`awk -v n=$1 'BEGIN{printf "%04X", n;}'`
echo -n -e "\\x${v:2:2}\\x${v:0:2}" >> $2
}
le32 () { # 32 bit version
v=`awk -v n=$1 'BEGIN{printf "%08X", n;}'`
echo -n -e "\\x${v:6:2}\\x${v:4:2}\\x${v:2:2}\\x${v:0:2}" >> $2
}
IioデータストリームのオーディオWAVファイルヘッダーを作成するために使用します。
channels=2
bits_per_sample=16
let "block_align = channels * bits_per_sample / 8"
wave_header () { # pass file name and data size as parameters; rest are constants set elsewhere
data_size=$2
let "RIFFsize = data_size + 44 - 8"
let "bytes_per_sec = sampleHz * block_align"
echo -e -n "RIFF" > $1
le32 $RIFFsize $1
echo -e -n "WAVEfmt " >> $1
le32 16 $1 # format size
le16 1 $1 #format tag: 1 = PCM
le16 $channels $1
le32 $sampleHz $1
le32 $bytes_per_sec $1
le16 $block_align $1
le16 $bits_per_sample $1 # bits per sample
echo -e -n "data" >> $1
le32 $data_size $1
}
Linux iio ADCデータのWAVファイルへのキャプチャ:
sampleHz=8000
milliseconds=15 # capture length
cd /sys/bus/iio/devices/iio:device0
cat /sys/bus/iio/devices/trigger0/name > trigger/current_trigger
echo 0 > buffer/enable
echo 0 > scan_elements/in_voltage0_en #
echo 1 > scan_elements/in_voltage1_en #
echo 1 > scan_elements/in_voltage2_en #
echo 0 > scan_elements/in_voltage3_en #
echo $sampleHz > sampling_frequency
sampleHz=`cat sampling_frequency` # read back actual sample rate
let "buffer_length = block_align * sampleHz * milliseconds / 1000"
echo $buffer_length > buffer/length
cd $HOME
echo 1 > /sys/bus/iio/devices/iio:device0/buffer/enable
wave_header data.wav $buffer_length
head -c $buffer_length /dev/iio:device0 >> data.wav # LE16 data
echo 0 > /sys/bus/iio/devices/iio:device0/buffer/enable
Busyboxの内容はわかりませんが、printfがawkよりも小さいため、これでうまくいくかもしれません。
$ printf "%c%c%c%c" 48 0 49 0 | hexdump
これは出力です:
$ printf "%c" 1 | hexdump
0000000 0031