C++:将字符串转换为十六进制,并支持变音符号

nqwrtyyt  于 2022-12-15  发布在  其他
关注(0)|答案(1)|浏览(122)

**一个

我已经建立了一个EEPROM(有点像一个非常低技术的USB棒)编程器,我正在写一个程序,它从一个txt文件读取文本,然后将其转换为二进制/十六进制,程序员可以使用它来编程到EEPROM上的数据。我已经得到了一切,除了一个函数,将字符串转换为十六进制。我已经尝试使用这个代码,它的工作有点好。

string Text = "This is a string.";
for(int i = 0; i < Text.size(); i++) {
    cout << uppercase << hex << (int)Text[i] << " ";
}

这将输出:

54 68 69 73 20 69 73 20 61 20 73 74 72 69 6E 67 2E

但是当给予它时:

Thïs ìs â stríng.

它将返回以下内容:

54 68 FFFFFFC3 FFFFFFAF 73 20 FFFFFFC3 FFFFFFAC 73 20 FFFFFFC3 FFFFFFA2 20 73 74 72 FFFFFFC3 FFFFFFAD 6E 67 2E

这看起来不太对。我最好的猜测是普通字符被转换成ASCII,特殊字符被转换成某种形式的Unicode。有没有办法让所有字符都变成Unicode?
边注EEPROM只能容纳2k字节,因此空间效率越高越好。
所以我的最终目标是:
1.创建一个函数,将字符串转换为十六进制的等价形式。最终的结果是节省空间并且支持变音符号
1.创建另一个可以读取十六进制并将其转换为字符串的函数,同样支持变音符号
如果这是不可能的,我愿意使用自定义格式,将存储一个'ê',如“|例如,e^”。与“|“作为我拦截一个特殊人物的方法。
谢谢你的帮忙!

lmvvr0a8

lmvvr0a81#

这里需要双重铸造:首先将字符强制转换为(unsigned char),然后强制转换为(int):

(int)(unsigned char)Text[i]

这是必要的,因为强制转换为(unsigned int)并不像你所期望的那样工作。这有符号的字符值首先被加宽,然后这强制转换被应用,但是在那一点上,这符号扩展已经被执行了。
https://godbolt.org/z/GhYz3T8v6上看到这个

相关问题