**一个
我已经建立了一个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^”。与“|“作为我拦截一个特殊人物的方法。
谢谢你的帮忙!
1条答案
按热度按时间lmvvr0a81#
这里需要双重铸造:首先将字符强制转换为(unsigned char),然后强制转换为(int):
这是必要的,因为强制转换为
(unsigned int)
并不像你所期望的那样工作。这有符号的字符值首先被加宽,然后这强制转换被应用,但是在那一点上,这符号扩展已经被执行了。在https://godbolt.org/z/GhYz3T8v6上看到这个