0

マイクを読み取り、PCM データをバッファーに格納するアプリケーションを開発しています。バッファーを 16 進数値に変換して操作したいと考えています。基本的に、C プログラムに xxd 機能を実装したいと考えています。PCMデータをファイル(file.pcm)に書き込んでから、「xxd -r file.c >> file.h」を使用することで、手動で行うことができます。これにより、構造体と長さの 16 進数データが​​得られます。

4

1 に答える 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;
}

いくつかの点に注意してください:

  1. ファイルに入れられる文字列は連続しています。改行なし (入力からの改行は0x0A0x0Dまたはその両方に変換されるため)。フォーマットを追加したい場合は、カウンターを追加し、カウンターの値に従ってファイルにスペースと改行 (and または else) を書き込んでください (たとえば、行if( !((i+1) % 16) ) { buff[0] = '\n'; fwrite(buff, 1, 1, fd); }の後fwrite(buff, 1, 2, fd);)。
  2. 生成されたファイルで xxd を使用する場合は、入力から 16 文字を読み取った後に新しい行を追加してください。さらに、各行の先頭にオフセットを追加する必要があります。
  3. 最後になりましたが、データから 16 進文字列への変換sprintfは行で行われます。「文字列に出力」(sprintf)されbuff「2 桁のゼロで左が埋められた大文字の 16 進数」char cとして解釈されます。
于 2012-12-10T08:26:58.397 に答える