C语言ASCII转十六进制函数转换希伯来字符א输出FFFF的问题咨询
问题核心原因解释
- 首先你的函数设计仅适用于ASCII字符(编码范围0127),希伯来字符「א」不属于ASCII字符集,在常见编码(如UTF-8、Windows-1255)中占12字节,且每个字节的编码值都大于127,这是问题的前提。
- 大部分C编译器默认
char类型为有符号类型(signed char),取值范围是-128~127。当字节值大于127时,会被识别为负数。 sprintf的%X格式化符要求传入的参数为unsigned int类型,你传入char类型参数时会触发整数提升规则:有符号负数提升为int时,高位会补符号位1。%02X仅保证最少输出2位、不足补前导0,不会截断高位,因此符号扩展带来的高位1会全部被输出为F,这就是你得到FFFF结果的核心原因。- ASCII字符编码值都在0~127范围内,就算是
signed char也是正数,整数提升时高位补0,因此%02X可以正常输出两位十六进制值,比如字符u编码为0x75,提升后高位都是0,最终输出75。
修复方案
修改sprintf行的参数,将chrASCII[i]强制转换为unsigned char,避免符号扩展:
sprintf((char*)chrHex + j, "%02X", (unsigned char)chrASCII[i]);
修改后非ASCII字符的每个字节都会正常输出两位十六进制值,比如UTF-8编码的「א」转换后结果为D790。
内容的提问来源于stack exchange,提问作者Omri Blumenthal
相关产品推荐
相关产品推荐

