0

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

4

1 回答 1

1

好吧,我假设你想要十六进制到十六进制字符串“转换”。

以下是从标准输入获取一些输入并将其作为十六进制数据写入文件的代码:

#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
于 2012-12-10T08:26:58.397 回答