首页 > 解决方案 > 希伯来字符在 HEX 中翻译为“FFFF”

问题描述

我有一个将 ASCII 字符数组转换为十六进制字符数组的代码:

void ASCIIFormatCharArray2HexFormatCharArray(char chrASCII[72], char chrHex[144])
{
  int i,j;
  memset(chrHex, 0, 144); 
  for(i=0, j=0; i<strlen(chrASCII); i++, j+=2)
  {
      sprintf((char*)chrHex + j, "%02X", chrASCII[i]);
  }
  chrHex[j] = '\0';
}

当我将函数插入 char 'א' - Alef,相当于英语中的 'A' 时,该函数执行以下操作:

chrHex = "FFFF"

当它甚至不是英文字母时,我不明白 1 个字符如何转换为 2 个字节的十六进制(“FFFF”)而不是 1 个字节(如 ASCII 中的“u”在十六进制中是“75”)。很想知道编译器如何处理'א'这样的解释。

标签: chexasciinon-ascii-characters

解决方案


当“א”出现在字符串文字中时,您的编译器可能会用字节 D7 16和 90 16来表示它,尽管 C 标准允许其他可能性。

当这些字节被解释为有符号的char时,它们的值为 -41 和 -112。当这些作为参数传递给 时sprintf,它们会自动提升为int。在 32 位二进制补码int中,用于表示 -41 和 -112 的位是 FFFFFFD7 16和 FFFFFF90 16

sprintf要求格式化这些的行为在%02X技术上没有由 C 标准定义,因为unsigned int应该为 传递Xan ,而不是传递int. 但是,您的 C 实现可能会将它们格式化为“FFFFFFD7”和“FFFFFF90”。

所以第一个sprintf将“FFFFFFD7”放在chrHex从元素 0 开始。

然后第二个sprintf将“FFFFFF90”chrHex从元素 2 开始,部分覆盖第一个字符串。现在chrHex包含“FFFFFFFF90”。

然后chrHex[j] = '\0';将一个空字符放入元素 4,将字符串截断为“FFFF”。

要解决此问题,请将 更改sprintf为期望 anunsigned char并传递一个unsigned char值(将提升为int,但sprintf期望它hhX适用于它并与它一起使用):

sprintf(chrHex + j, "%02hhX", (unsigned char) chrASCII[i]);

推荐阅读