我对c ++很新,这是我的问题: 我有一个std :: string,我想将每个字符转换为其Ascii符号,将它们放入一个unsigned char缓冲区并通过串口发送。我知道它不能这么清楚,所以我举一个例子:
std::string stringaStd = "010203";
我想通过串口发送序列:
'0' '1' '0' '2' '0' '3'
应该相当于:
0x30 0x31 0x30 0x32 0x30 0x33
因此,stringaStd的字符必须转换为Ascii,然后通过串口发送。 有什么想法怎么做?
谢谢!
答案 0 :(得分:1)
ASCII是7位字符。有8位扩展(ANSI字符集,CP-1252,无论如何),但纯ASCII不使用最高位。网络传输可能会将其用作错误检测/纠正的奇偶校验标志,但我正在偏离主题。
char
按标准定义至少为8位宽,即它绝对能够保存ASCII字符。
使用{/ 1}}中的<{p>}从字符串中检索单个char
std::string::operator[]
和,仅获取与ASCII相关的部分,并使用stringaStd[x]
:
0x7f
通常,代表ASCII字符时stringaStd[x] & 0x7f
中未使用的位被清除,但我不认为这在任何地方是标准化的。
整个过程可能会被整合成一个循环。可以使用异常(char
),C-string空终止符(std::string::at
或自C ++ 11,也std::string::c_str
)或迭代器(基于范围的{{}来执行范围检查。 1}} - 环)
。
此外,使用提供的API与相应的串行端口进行交互,您就完成了。
答案 1 :(得分:0)
如果您的编译器使用ASCII来编码字符串(几乎可以肯定的话;我只是为了完整性而提到这一点),那么std::string
对象中的字符已经是ASCII。无需转换。被视为数字的字符值'0'
的值为0x30
。试试吧:
char ch = '0';
std::cout << ch << ' ' << (int)ch << '\n';
要将这些ASCII值一次写入一个端口,只需执行以下操作:
std::string text("012345");
for (int i = 0 ;i < text.size(); ++i)
send_to_port(text[i]);
如果您需要中间缓冲区,请再次执行:
unsigned char buf[80];
assert(text.size() <= 80);
std::copy(text.begin(), text.end(), buf);
使用char
屏蔽0x7f
值是错误的。如果字符串以某种方式具有非ASCII值(即,设置了高位的8位值),则屏蔽将清除高位,在有效ASCII字符的范围内生成一个值,但该值不代表任何有意义的值