c - 希伯来字符在 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”)。很想知道编译器如何处理'א'这样的解释。
解决方案
当“א”出现在字符串文字中时,您的编译器可能会用字节 D7 16和 90 16来表示它,尽管 C 标准允许其他可能性。
当这些字节被解释为有符号的char
时,它们的值为 -41 和 -112。当这些作为参数传递给 时sprintf
,它们会自动提升为int
。在 32 位二进制补码int
中,用于表示 -41 和 -112 的位是 FFFFFFD7 16和 FFFFFF90 16。
sprintf
要求格式化这些的行为在%02X
技术上没有由 C 标准定义,因为unsigned int
应该为 传递X
an ,而不是传递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]);
推荐阅读
- java - colorPrimary 覆盖按钮样式
- python-3.x - 如何在 Pycharm 中使用 rasa
- c# - UWP XAML ListBox ControlTemplate 触发器
- r - 无法从 while 循环中生成结果
- c++ - 从 C++ 中的模板类继承,无法编译
- php - 错误:此路由不支持 POST 方法。支持的方法:GET、HEAD
- angularjs - 使用 AngularJS 验证一组表单字段
- python - 没有足够的值来解包(试图在稀疏矩阵的每一行中只保留前 K 个值)
- netlogo - NetLogo:如何让海龟在一次滴答后返回
- powerbi - 创建存储桶以在 Power BI 中定位月份