我对c ++很陌生,这是我的问题:我有一个 std::string,我想将每个字符转换为其 Ascii 符号,将它们放入无符号字符缓冲区并通过串行端口发送所有字符。我知道它不可能那么清楚,所以我举一个例子:
std::string stringaStd = "010203";
我想通过串行端口发送序列:
'0' '1' '0' '2' '0' '3'
这应该等效于:
0x30 0x31 0x30 0x32 0x30 0x33
因此,stringaStd 的字符必须转换为 Ascii,然后通过串行端口发送。知道如何做到这一点的任何想法?
谢谢!
ASCII 是 7 位字符。有8位的扩展(ANSI字符集,CP-1252等),但纯ASCII不使用最高有效位。网络传输可能会将其用作错误检测/纠正的奇偶校验标志,但我偏离了主要主题。
根据标准定义,char
至少具有 8 位宽,即它绝对能够容纳 ASCII 字符。
使用std::string::operator[]
从字符串中检索单个char
,如
stringaStd[x]
并且,要仅获取与 ASCII 相关的部分,并且带有 0x7f
:
stringaStd[x] & 0x7f
通常,在表示 ASCII 字符时,char
中未使用的位会被清除,但我认为这在任何地方都没有标准化。
整个过程可以分解成一个循环。范围检查可以使用异常(std::string::at
),C字符串空终止符(std::string::c_str
或自C++11起也std::string::data
)或迭代器(基于范围的for
循环)来执行。
此外,使用提供的 API 与相应的串行端口进行交互,您就完成了。
如果您的编译器使用 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);
用0x7f
掩盖char
值是错误的。如果字符串以某种方式具有非 ASCII 值(即设置了高位的 8 位值),则掩码将清除高位,在有效 ASCII 字符的范围内生成一个值,但该值不会表示任何有意义的内容。