输入一个字符并输出它的 ASCII 十六进制值
Take in a character and output its ASCII hex value
我正在(用 C 语言)为 ATMEGA 微控制器上的 UART 编写自己的串行函数,我需要让用户输入单个字符并让它输出其 ASCII 十六进制值,
即如果用户键入 'a',输出将为“0x61”。我写了一个函数叫
putvalue(unsigned char ch)
,
接收单个字符并将其显示到屏幕上,所以现在我只需要编写一个函数接收字符并将其转换为与其 ASCII 十六进制值相对应的字符。到目前为止,我已经完成了以下工作:
void puthexvalue(unsigned char ch) {
putvalue(0x30) \writes a '0' to the screen
putvalue(0x78) \writes an 'x' to the screen
unsigned char ch1 = ch & 0xF0;
unsigned char ch2 = (ch & 0x0F) >> 4;
所以现在我有了要在 ch1
和 ch2
中打印的字符的数值,但我不确定如何实际找到与这些数字对应的 ASCII 值并打印那个值。
如有任何提示或帮助,我们将不胜感激,谢谢!
编辑:应该是 ch1 = ch & 0xf0 >> 4
和 ch2 = ch & 0x0f
。
从'0'
到'9'
的字符编码在C规范中保证是连续的。
从'A'
到'Z'
和从'a'
到'z'
的字符编码在ASCII码中是连续的。
因此,如果数字在0到9之间,可以通过在数字上加上'0'
得到ASCII码。
如果数字在 10 到 15 之间,您可以通过在数字减去 10 后添加 'A'
或 'a'
来获得 ASCII 码。
你对 ch1
和 ch2
的计算也是错误的:ch1
是 16 的乘法(因为低位被清除)并且 ch2
将始终为零(因为最后 4 位以外的位被清除,然后右移 4 位)。
包括固定计算ch1
和ch2
的实现是这样的:
char getHexChar(unsigned char c) {
if (c <= 9) return '0' + c;
else if (c <= 15) return 'A' + (c - 10);
else return '?';
}
void puthexvalue(unsigned char ch) {
putvalue(0x30); //writes a '0' to the screen
putvalue(0x78); //writes an 'x' to the screen
unsigned char ch1 = (ch & 0xF0) >> 4;
unsigned char ch2 = ch & 0x0F;
putvalue(getHexChar(ch1));
putvalue(getHexChar(ch2));
}
我正在(用 C 语言)为 ATMEGA 微控制器上的 UART 编写自己的串行函数,我需要让用户输入单个字符并让它输出其 ASCII 十六进制值,
即如果用户键入 'a',输出将为“0x61”。我写了一个函数叫
putvalue(unsigned char ch)
,
接收单个字符并将其显示到屏幕上,所以现在我只需要编写一个函数接收字符并将其转换为与其 ASCII 十六进制值相对应的字符。到目前为止,我已经完成了以下工作:
void puthexvalue(unsigned char ch) {
putvalue(0x30) \writes a '0' to the screen
putvalue(0x78) \writes an 'x' to the screen
unsigned char ch1 = ch & 0xF0;
unsigned char ch2 = (ch & 0x0F) >> 4;
所以现在我有了要在 ch1
和 ch2
中打印的字符的数值,但我不确定如何实际找到与这些数字对应的 ASCII 值并打印那个值。
如有任何提示或帮助,我们将不胜感激,谢谢!
编辑:应该是 ch1 = ch & 0xf0 >> 4
和 ch2 = ch & 0x0f
。
从'0'
到'9'
的字符编码在C规范中保证是连续的。
从'A'
到'Z'
和从'a'
到'z'
的字符编码在ASCII码中是连续的。
因此,如果数字在0到9之间,可以通过在数字上加上'0'
得到ASCII码。
如果数字在 10 到 15 之间,您可以通过在数字减去 10 后添加 'A'
或 'a'
来获得 ASCII 码。
你对 ch1
和 ch2
的计算也是错误的:ch1
是 16 的乘法(因为低位被清除)并且 ch2
将始终为零(因为最后 4 位以外的位被清除,然后右移 4 位)。
包括固定计算ch1
和ch2
的实现是这样的:
char getHexChar(unsigned char c) {
if (c <= 9) return '0' + c;
else if (c <= 15) return 'A' + (c - 10);
else return '?';
}
void puthexvalue(unsigned char ch) {
putvalue(0x30); //writes a '0' to the screen
putvalue(0x78); //writes an 'x' to the screen
unsigned char ch1 = (ch & 0xF0) >> 4;
unsigned char ch2 = ch & 0x0F;
putvalue(getHexChar(ch1));
putvalue(getHexChar(ch2));
}