scanf十六进制长字节数组

scanf十六进制长字节数组,c,scanf,C,Scanf,我有一个以下格式的文件: 0 b71b3a8de0c18abd2e56ec5f4efc4af2ba084604 1 4bec20891a68887eef982e9cda5d02ca8e6d4f57 第一个值是整数,第二个整数是以十六进制编码的20字节值。我希望能够使用fscanf循环读取两个值,如下所示: FILE *file = fopen("file.txt", "r"); int id; char hash[20]; while(fscanf(has_chunks, "%i %40x\n

我有一个以下格式的文件:

0 b71b3a8de0c18abd2e56ec5f4efc4af2ba084604
1 4bec20891a68887eef982e9cda5d02ca8e6d4f57
第一个值是整数,第二个整数是以十六进制编码的20字节值。我希望能够使用
fscanf
循环读取两个值,如下所示:

FILE *file = fopen("file.txt", "r");
int id;
char hash[20];
while(fscanf(has_chunks, "%i %40x\n", &id, c_hash) == 2){
   // Do Stuff
}
但是,这显然不起作用,因为
%40x
需要一个无符号的int指针,但它不够大,无法容纳该值。我知道我可以使用多个格式化程序,比如
%x%x%x
,但这看起来并不优雅。使用
fscanf
有更好的方法吗

b7 1b 3a 8d e0 c1 8a bd 2e 56 ec 5f 4e fc 4a f2 ba 08 46 04
每对字符的范围介于
0
0xff
之间。这适合一个字节,或
无符号字符
。散列函数通常也需要
无符号字符

使用以下转换:

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;
    }
}
inti,id;
无符号整数v;
无符号字符散列[20];
char-buf[41];
而(fscanf(文件“%d%s\n”,&id,buf)==2)
{
对于(i=0;i<20;i++)
{
如果(sscanf(buf+i*2,%2x,&v)!=1)中断;
散列[i]=(无符号字符)v;
}
}

C!=C++。只使用您正在使用的语言进行标记,除非两者实际上都相关。也就是说,这看起来像C代码——在C++中,它将使用不受欢迎的C++内容。