24

私の問題は、この正確なバイトでファイルを作成する必要があることです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」を出力しません(他のすべての値は問題ありません)。

あなたの推薦は何ですか?

4

6 に答える 6

39

次のコマンドを使用できます。

echo -n -e \\x48\\x00\\x49\\x00 > myfile
于 2011-10-05T09:06:14.930 に答える
6

エコーを試すことができます。これにより、任意のASCII文字も使用できます(これらの数値は8進数です)。

echo -n -e \\0060\\0000\\0061\\0000  | hexdump
于 2011-04-07T14:41:09.740 に答える
6

POSIX AWK標準では、%c形式でAWKのprintfに0を渡すと、不特定の動作が発生する可能性があるとされています。ただし、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
于 2014-06-16T09:41:10.567 に答える
4

古い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
于 2016-07-18T23:56:59.643 に答える
1

整数を出力するためのより一般的な関数のカップル:

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
于 2019-06-18T00:26:12.440 に答える
0

何がbusyboxにあるのかわかりませんが、printfがawkよりも小さいため、これは機能する可能性があります。

$ printf "%c%c%c%c" 48 0 49 0 | hexdump

これは出力です:

$ printf "%c" 1 | hexdump
0000000 0031                    
于 2011-04-07T14:41:47.360 に答える