【问题标题】:Hex to Decimal conversion in CC中的十六进制到十进制转换
【发布时间】:2011-02-04 06:55:54
【问题描述】:

这是我将十六进制转换为十进制的代码。十六进制值存储在无符号字符数组中:

  int liIndex ;
  long hexToDec ;
  unsigned char length[4];

  for (liIndex = 0; liIndex < 4 ; liIndex++)
  {
       length[liIndex]= (unsigned char) *content;
       printf("\n Hex value is %.2x", length[liIndex]);
       content++;
  }
  hexToDec = strtol(length, NULL, 16);

每个数组元素包含 1 个字节的信息,我已经读取了 4 个字节。当我执行它时,这是我得到的输出:

 Hex value is 00
 Hex value is 00
 Hex value is 00
 Hex value is 01
 Chunk length is 0

谁能帮我理解这里的错误。十进制值应该是 1 而不是 0。

问候, 小黑子

【问题讨论】:

  • 为什么不简单地做 hexToDec = strtol(content, NULL, 16); ?
  • *content 在代码中存储了一个PNG文件的所有内容。
  • 此问题未包含解决问题所需的全部信息。
  • 它有助于始终以二进制形式存储您的数据,而不是将十六进制值作为 ascii 代码存储在数组中(也是二进制,但这不是我的意思),只需将实际的二进制存储在数组中即可。即 char c= 0x47;然后您可以使用 printf ("%x", c); 访问十六进制值;而且您不必担心这些事情:将数据保存为二进制,使用返回表示的方法(例如 printf)更改表示。请记住,所有数据都是二进制的。现在对我来说很明显这是家庭作业,但请记住我所说的

标签: c decimal hex


【解决方案1】:

strtol 需要一个以零结尾的字符串。 length[0] == '\0',因此 strtol 就在那里停止处理。它会转换像“0A21”这样的东西,而不是像你有的像 {0,0,0,1} 这样的东西。

content 的内容是什么,你到底想做什么?你所构建的东西在很多方面对我来说似乎很奇怪。

【讨论】:

  • *content 实际上是存储 PNG 文件的内容。我正在读取基于 PNG 文件格式的字节数。所以在这里,一个块的长度是 4 个字节长,所以我将 4 个字节存储在一个 char 数组中。好像有什么问题?
【解决方案2】:

我对您使用 %x 的猜测是 content 将您的十六进制数编码为整数数组,而不是字符数组。也就是说,您是将content 中的0 位表示为'\0',还是'0'

strtol 仅适用于后一种情况。如果content 确实是一个整数数组,那么下面的代码应该可以解决问题:

hexToDec = 0;
int place = 1;
for(int i=3; i>=0; --i)
{
  hexToDec += place * (unsigned int)*(content+i);
  place *= 16;
}
content += 4;

【讨论】:

  • content 正在存储我正在阅读的文件的所有内容。你能帮我使用长度数组而不是操纵“内容”变量吗?
  • 嗯,没有太多意义将内容读入长度,然后使用长度,而不是直接使用内容。我已经修改了我的代码,使其更符合您的操作。
  • 这段代码似乎有问题...它始终无法解释该值..将尝试找出原因...撤消“正确答案”!!
  • 代码返回 -ve 十进制值导致段错误!!
  • 代码做了几个假设,这些假设可能成立也可能不成立;但是,如果您了解基本算法,您应该能够轻松地使其适应您的需求。一些让您入门的假设: 1) 内容仅包含字符 '\0' 到 '\16'。 2) hexToDec 足够大,可以容纳 32 位正整数(无符号整数应该适用于大多数现代平台)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-05
  • 2011-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-31
相关资源
最近更新 更多