2017-10-22 8 views
1

는 I는 다음과 같은 형식으로 파일 가지고는 scanf 진수 긴 바이트 배열

0 b71b3a8de0c18abd2e56ec5f4efc4af2ba084604 
1 4bec20891a68887eef982e9cda5d02ca8e6d4f57 

제 값은 정수를, 두 번째 정수 진수 인코딩 된 20 바이트의 값이다. 그래서 같은 fscanf 루프를 사용하여 두 값의 수 읽기를 할 것을 권장합니다 %40x는 부호없는 INT 포인터를 예상대로

FILE *file = fopen("file.txt", "r"); 
int id; 
char hash[20]; 
while(fscanf(has_chunks, "%i %40x\n", &id, c_hash) == 2){ 
    // Do Stuff 
} 

그러나이 명확하게 작동하지 않습니다,하지만이 값을 보관 유지하는데 충분한 크기가 아닌 . %x%x%x과 같은 여러 형식 지정자를 사용할 수 있다는 것을 알고 있지만이 모양이 좋지 않습니다. fscanf을 사용하여 더 좋은 방법이 있습니까?

+2

C를 = C++를. 둘 다 실제로 관련이없는 한 사용중인 언어로만 태그하십시오. 즉, C 코드처럼 보입니다. C++에서는 사용되지 않는 C++ 항목을 사용하게됩니다. – tambre

답변

1
b7 1b 3a 8d e0 c1 8a bd 2e 56 ec 5f 4e fc 4a f2 ba 08 46 04 

문자 각 쌍 0xff-0 사이의 범위에있다. 이것은 1 바이트 또는 unsigned char에 맞습니다. 해시 함수는 일반적으로 unsigned char을 기대합니다.

는 다음과 같은 변환 사용!

int i, id; 
unsigned int v; 
unsigned char hash[20]; 
char buf[41]; 
while(fscanf(file, "%d %s\n", &id, buf) == 2) 
{ 
    for(i = 0; i < 20; i++) 
    { 
     if(sscanf(buf + i * 2, "%2x", &v) != 1) break; 
     hash[i] = (unsigned char)v; 
    } 
}