如何将PCM数据转换为十六进制数据

时间:2012-12-08 12:46:46

标签: c linux

我正在开发一个应用程序,它读取麦克风并将PCM数据存储在缓冲区中,我想将缓冲区转换为十六进制值并对其进行操作。  基本上我想在我的C程序中实现xxd功能。 我可以通过将PCM数据写入文件(file.pcm)然后使用来手动完成 “xxd -r file.c>> file.h”。这将给出结构中的十六进制数据和长度。

1 个答案:

答案 0 :(得分:1)

好吧,我假设你想要hex到hex-string“转换”。

这是代码从stdin获取一些输入并将其作为十六进制数据写入文件:

#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或两者都有。如果要添加格式,请添加计数器,并根据计数器的值(例如,if( !((i+1) % 16) ) { buff[0] = '\n'; fwrite(buff, 1, 1, fd); }行后fwrite(buff, 1, 2, fd);)为文件写入空格和换行符(或其他)
  2. 如果要在生成的文件上使用xxd,请在从输入中读取16个字符后添加新行。此外,您需要在每行的开头添加偏移量。
  3. 最后但并非最不重要的是,从数据到十六进制字符串的转换是在sprintf行完成的。它'打印到字符串'(sprintf)buff char c被解释为“两位数左半填充大写十六进制”