如何在C语言中从文本文件中读取十六进制数据

如何在C语言中从文本文件中读取十六进制数据,c,text,hex,can-bus,C,Text,Hex,Can Bus,我试图读取带有CAN数据的文本文件,该文件的格式如下: XL_CAN_EV_TAG_RX_OK ch:0 t=51165282304 id:98FF5C80数据链路连接器:7 0000000 40000E0 XL_CAN_EV_TAG_RX_OK ch:0 t=51172728832 id:98FF1480 数据链路:7 FFFFFF AD7C1CFF XL_CAN_EV_TAG_RX_OK ch:0 t=5117307360 id:98FF1080数据链路:7 FFFFE30C0E01FF X

我试图读取带有CAN数据的文本文件,该文件的格式如下:

XL_CAN_EV_TAG_RX_OK ch:0 t=51165282304 id:98FF5C80数据链路连接器:7 0000000 40000E0 XL_CAN_EV_TAG_RX_OK ch:0 t=51172728832 id:98FF1480 数据链路:7 FFFFFF AD7C1CFF XL_CAN_EV_TAG_RX_OK ch:0 t=5117307360 id:98FF1080数据链路:7 FFFFE30C0E01FF XL_CAN_EV_TAG_RX_OK通道:0 t=51173285888 id:98FF1180数据链路:7 FFFF9706FEFFFB XL_CAN_EV_TAG_RX_OK ch:0 t=51173564416 id:98FF1280数据链路:7 FFFF9706FEFFFB

我必须阅读CANid和CANDATA,如上所示,我使用以下工具阅读了CANid:

unsigned int hex = 0; 
fscanf(fr, "%X", &hex); 
printf(" %X ", hex);
我使用c=fgetcfr;直到c读入第二个:十六进制读入canid

但是,当我必须使用相同的代码fscaf读取数据时,它只读取最后7个数据。例如,我得到如下结果:

40000e0 D7C1CFF C0E01FF 6FEFFFB 6FEFFFB

这就是问题所在。我发现的另一种方法是将其读取为char

如果我使用getc读取数据,我会以char格式获取数据,我不确定如何将其转换为十六进制,并且它会单独读取每个字母,我必须将它们组合起来,然后将其转换为int-type十六进制,并将其发送到数组,类似这样:

数据[0]=FF;数据[1]=FF;数据[2]=FF;数据[3]=AD;数据[4]=7C; 数据[5]=1C;数据[6]=FF


我被困在这里已经两天了,谷歌搜索了所有的东西,尝试了所有的东西,似乎都不管用,你能帮我解决这个问题吗。多谢各位

您正在读取一个无符号整数并存储到一个无符号整数中。无符号整数是32位,十六进制值是7字节或56位长。你需要一个64位的容器。您需要使用无符号长整型,并用%llX读/写它们。

您正在读取无符号整型并存储到无符号整型中。无符号整型是32位,十六进制值是7字节或56位。你需要一个64位的容器。您需要使用unsigned long long int并用%llX读/写它们。

非常感谢您的回复,我现在可以获得全部数据,您知道如何将其转换或拆分为数组吗?@Akash您想要将7个字节进行拆分,从最高有效到最低有效,因此您需要使用如下移位:data[I]=十六进制>>8*6-i和0xFF。这将为您提供数据[0]=hex>>48&0xFF,数据[1]=hex>>40&0xFF,依此类推,最后一个为数据[6]=hex&0xFF,最后一个的移位值为0。您可以使用for循环或手动写下它们。&0xFF仅用于选择您想要的字节并丢弃其余的字节。非常感谢,伙计,您救了我的命!!它奏效了非常感谢您的回复,我现在可以获得全部数据了,您知道如何将其转换或拆分为一个数组吗?@Akash您想将7个字节进行拆分,从最高有效到最低有效,因此您想使用如下移位:data[I]=hex>>8*6-I&0xFF。这将为您提供数据[0]=hex>>48&0xFF,数据[1]=hex>>40&0xFF,依此类推,最后一个为数据[6]=hex&0xFF,最后一个的移位值为0。您可以使用for循环或手动写下它们。&0xFF仅用于选择您想要的字节并丢弃其余的字节。非常感谢,伙计,您救了我的命!!它奏效了