2012-12-08 4 views
0

마이크를 읽고 PCM 데이터를 버퍼에 저장하는 응용 프로그램을 개발 중이며 버퍼를 16 진수 값으로 변환하고 조작하려고합니다. 기본적으로 C 프로그램에서 xxd 기능을 구현하려고합니다. 파일 (file.pcm)에 PCM 데이터를 쓴 다음 "xxd -r file.c >> file.h"를 사용하여 수동으로 처리 할 수 ​​있습니다. 그러면 구조와 길이에 16 진수 데이터가 제공됩니다.PCM 데이터를 16 진수 데이터로 변환하는 방법

+0

당신이 뭘 하려는지 이해가 안 돼요. 16 진수 데이터를 16 진수 문자열로 변환하려고합니까? "Hello world"(16 진수 표현은''68656C6C6F20776F726C64 '로'[0x68, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x77, 0x6F, 0x72, 0x6C, 0x64]'와 유사)? –

+0

기본적으로 마이크에서 스트림을 기록하고 원시 데이터로 파일에 저장합니다. 원시 데이터를 HexaDecimal 데이터로 변환합니다. – wjdoss

+0

@wjdoss : 16 진수는 단순히 원시 데이터를 나타내는 방법입니다. – dreamlax

답변

1

글쎄, 나는 16 진수에서 16 진수의 "변환"을 원한다고 가정 할 것이다.

  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; 
    } 
    

    상점 몇 가지주의 사항 : 여기

    코드가 표준 입력에서 어떤 입력을하고 파일에 진수 데이터로 쓰기입니다 마디 없는. 개행 문자가 없으므로 (입력 된 개행 문자는 0x0A, 0x0D 또는 둘 다로 변환됩니다.) 서식을 추가하려면 카운터를 추가하고 카운터 값에 따라 공백과 개행 문자 (또는 기타)를 파일에 씁니다 (예 : 줄 다음에 if(!((i+1) % 16)) { buff[0] = '\n'; fwrite(buff, 1, 1, fd); }).
  2. 생성 된 파일에 xxd를 사용하려면 입력에서 16 개의 문자를 읽은 후 새 행을 추가하십시오. 또한 각 줄의 시작 부분에 오프셋을 추가해야합니다.
  3. 마지막으로 데이터에서 16 진수 문자열로의 변환은 sprintf 행에서 이루어집니다. 그것은 문자열로 인쇄 '(sprintf와) buffchar c 해석 으로 "두 자리 숫자 제로 왼쪽 패딩 대문자 진수"
+0

이것은 좋은 예입니다. 일부 운영 체제에는 원시 데이터를 16 진수로 변환하는 도구 (예 :'hd' 또는'hexdump ')가 이미 있습니다. 일부 운영 체제에는 16 진수 편집기도 있습니다. 또한 한 번에 한 문자 씩 읽고 쓰는 것이 전체 청크를 변환하는 것보다 효율적이지 않을 수 있습니다. 또한,'sprintf' 호출에서'(char) c' 캐스트는 불필요합니다. 어쨌든'int'로 승격됩니다. 또한,'% x' (와'% X')는 **'unsigned int' **를 기대합니다. – dreamlax

+0

네 말이 맞지만이 코드를 읽고 이해하기 쉽도록 작성했다. 그래서 독자에게 변수의 유형을 생각 나게하는 불필요한 캐스트를 추가했습니다 (그리고 독자는 printf가 내부적으로 어떤 일을하는지 신경 쓰지 않아도됩니다.)). 문자열이 아닌 char을 사용하는 것과 동일합니다. 읽기 쉽고 (개선하기 쉽고) 포인터 처리와 같은 불필요한 어려움을 피할 수 있습니다. % x | % X는'unsigned int'를 사용하기 때문에'char' 대신'unsigned char'을 사용하도록 코드를 수정했습니다. –

관련 문제