gpt4 book ai didi

将十六进制数字转换为十进制以进行比较 (C)

转载 作者:太空宇宙 更新时间:2023-11-04 07:49:09 24 4
gpt4 key购买 nike

我正在尝试制作一个程序来确定是否正确创建了一个 intel hex 文件,而我用来生成它们的一个程序没有正确生成一个,所以我要制作一个。

到目前为止,我可以从目标文件中读取一行,但是我在将十六进制数字从字符串转换为数字进行比较时遇到了问题。这是我令人不安的片段:

//hx=opened file handle
unsigned char hexv,hexsz,hexcs;
while ((line=getline(&hexstring,&buffer,hx))> -1){
//Trying to convert hexadecimal character in byte 7 and 8 of string to number
//Hexsz must contain actual number representing number of hex digits to process
sprintf(hexsz,"%02x",hexstring[7]);
//Checksum = 0
hexcs=0;
for (hexc=0;hexc<(hexsz*2);hexc+=2){
//Add next hexadecimal number to checksum
sprintf(hexv,"%02x",hexstring[9+hexc]);
hexcs+=hexv;
}
//Check checksum with stored checksum
sprintf(hexv,"%02x",hexstring[9+hexc]);
if (hexcs != hexv){
printf("HEX checksum error!\n");
}
}

这些 sprintf 有问题,我无法弄清楚。

我唯一知道的就是执行以下操作:

  1. 分配一个临时字符*
  2. string 将十六进制值复制到该字符*
  3. 对该字符使用 strtol

但难道就没有更简单的方法吗?

我尝试用 strtol(startaddress,endaddress,16) 进行转换,但程序无法识别。它期望 endaddress 为 NULL。

那么将大字符串中的两个字节的字符串转换为十六进制的更简单的方法是什么?

例如,如果我的字符串是

:10007B00AB83AD8290015C938D828B83F531EF85E1

我想从中转换值 7B,最简单的方法是什么?

最佳答案

simple way to convert a two-byte string in a large string to a hexadecimal?

隔离两个字符并转换。

//               012345678 
const char *s = ":10007B00AB83AD8290015C938D828B83F531EF85E1";
int n = 5;

unsigned value;
if (sscanf(s + n, "%2x", &value) == 1) {
printf("Value at %.2s: %02X\n", s+n, value);
} else {
puts("Fail");
}

// Form a 3-char string such as '7', 'B', '\0'
const char substring[3] = { s[n], s[n+1] };
char *endptr;
long value = strtol(substring, &endptr, 16);
if (endptr > substring) {
printf("Value at %s: %02X\n", substring, value);
} else {
puts("Fail");
}

strtol(startaddress,endaddress,16)strtol() 的错误使用。 endptr 是指针的地址,而不仅仅是结束地址。

long int strtol(const char * restrict nptr, char ** restrict endptr, int base);

“它期望 endaddress 为 NULL。” --> 在这里传递 NULL 是可以的,但是代码缺少信息来决定它转换成功。相反,传递 char * 的地址,如上。然后测试是否发生了转换。


迂腐的代码不会在不知道 s 的情况下在 { s[n], s[n+1] }; 中使用 s[n+1] [n] 不是空字符。但我希望循环已经检查过了。

const char *s = ":10007B00AB83AD8290015C938D828B83F531EF85E1";

if (s[0] == ':') {
unsigned n = 1;
while (s[n] && s[n+1]) {
const char substring[3] = { s[n], s[n+1] };
...
n += 2;
}
...

`

关于将十六进制数字转换为十进制以进行比较 (C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54962712/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com