マイクを読み取り、PCM データをバッファーに格納するアプリケーションを開発しています。バッファーを 16 進数値に変換して操作したいと考えています。基本的に、C プログラムに xxd 機能を実装したいと考えています。PCMデータをファイル(file.pcm)に書き込んでから、「xxd -r file.c >> file.h」を使用することで、手動で行うことができます。これにより、構造体と長さの 16 進数データが得られます。
1102 次
1 に答える
1
さて、16進数から16進数文字列への「変換」が必要だと仮定します。
次のコードは、stdin から入力を受け取り、それを 16 進数データとしてファイルに書き込みます。
#include <stdio.h>
int main(int argc, char* argv[])
{
FILE* fd = NULL; // File descriptor.
unsigned char c = '\0'; // Character.
int status = 0; // fread() status.
if(argv[1] == NULL)
{
fprintf(stderr,
"Usage: %s <file name>\n",
argv[0]);
return 1;
}
fd = fopen(argv[1], "w");
if(fd == NULL)
{
fprintf(stderr,
"Error: cannot write to file %s.\n",
argv[1]);
return 1;
}
for(status = fread(&c, 1, 1, stdin);
c != EOF && status != 0;
status = fread(&c, 1, 1, stdin)
)
{
char buff[2];
sprintf(buff, "%02X", (unsigned char)c);
c = 0;
fwrite(buff, 1, 2, fd);
}
fclose(fd);
return 0;
}
いくつかの点に注意してください:
- ファイルに入れられる文字列は連続しています。改行なし (入力からの改行は
0x0A
、0x0D
またはその両方に変換されるため)。フォーマットを追加したい場合は、カウンターを追加し、カウンターの値に従ってファイルにスペースと改行 (and または else) を書き込んでください (たとえば、行if( !((i+1) % 16) ) { buff[0] = '\n'; fwrite(buff, 1, 1, fd); }
の後fwrite(buff, 1, 2, fd);
)。 - 生成されたファイルで xxd を使用する場合は、入力から 16 文字を読み取った後に新しい行を追加してください。さらに、各行の先頭にオフセットを追加する必要があります。
- 最後になりましたが、データから 16 進文字列への変換
sprintf
は行で行われます。「文字列に出力」(sprintf)されbuff
、「2 桁のゼロで左が埋められた大文字の 16 進数」char c
として解釈されます。
于 2012-12-10T08:26:58.397 に答える