记--C语言实现 文本形式的字符串和十六进制字符串的相互转换。如"01" <==> "3031"

有的数据包含不可见字符,直接打印出来会不可见或残缺,需要转换为十六进制直接看ASCII码值。

二、测试代码

#include <stdio.h>
#include <string.h>
/* ASCII字符 '0'  '1'  '2'  '3'  '4'  '5'  '6'  '7'  '8'  '9' 
 * ASCII码值 0x30 0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x38 0x39 
typedef unsigned char uint8_t;
//判断是否是十六进制的基数
int isHexNum(uint8_t _hexNum)
	if('0'<=_hexNum && _hexNum<='9')
		return 1;
	else if('A'<=_hexNum && _hexNum<='F')
		return 2;
	else if('a'<=_hexNum && _hexNum<='f')
		return 3;
	return -1;
void numToHexStr(uint8_t _hexNum, uint8_t* _hexStr)
	uint8_t tmp;
	if(NULL == _hexStr)
		return;
	//低4bit
	tmp = (_hexNum >> 4) & 0x0f;
	if(tmp <= 9)
		*_hexStr = tmp+'0';
		*_hexStr = tmp-0x0a + 'A';
	_hexStr++;
	//高4bit
	tmp = _hexNum & 0x0f;	
	if(tmp <= 9)
		*_hexStr = tmp+'0';
		*_hexStr = tmp-0x0a + 'A';
//将字符串转为16进制形式,以查看不可见字符 "01" ==> "3031"
int toHexStr(const uint8_t* _str, uint8_t *_hexStr)
	int i;
	int len;
	uint8_t* resultPtr;
	if(NULL == _str || NULL == _hexStr)
		return -1;
	len = strlen(_str);
	resultPtr = _hexStr;
	for(i=0; i<len; i++)
		numToHexStr(_str[i], resultPtr);
		resultPtr += 2;
	return strlen(_hexStr);
//十六进制的字符转数字
uint8_t charToHexNum(uint8_t hexChar)
	uint8_t tmp;
	if(1>isHexNum(hexChar))
		return 0xFF;
	if(hexChar<='9')
		tmp = hexChar-'0';
	else if(hexChar<='F')
		tmp = hexChar-'7';
		tmp = hexChar-'W';
	return tmp;
//将16进制形式的字符串转为文本形式 "3031" ==> "01"
int hexToStr(const uint8_t* _hexStr, uint8_t* _str)
	int i;
	int len;
	uint8_t* ptr;
	if(NULL == _str || NULL == _hexStr)
		return -1;
	len = strlen(_hexStr);
	ptr = _str;
	//要是单数个字符,则最后一个会被丢弃
	for(i=0; i<len-1;i++)
		//是十六进制的基数才转换
		//if(0<isHexNum(_hexStr[i]))
			*ptr = charToHexNum(_hexStr[i])*16;			
			*ptr += charToHexNum(_hexStr[i]);
			ptr++;
	return strlen(_str);
int main(void)
	//将字符串转为16进制形式
	uint8_t str1[128] = "0123456789ABCBEFGabcdefg+-*/";
	printf("str1:%s\n", str1);	
	uint8_t hexStr[256] = {0};
	toHexStr(str1, hexStr);
	printf("hexStr:%s\n", hexStr);
	//16进制形式的字符串转为文本形式	
	uint8_t str2[128] = {0};
	hexToStr(hexStr, str2);
	printf("str2:%s\n", str2);
	return 0;

三、测试结果

四、附--ASCII表

十进制ASCII码
ASCII控制字符ASCII控制字符ASCII控制字符ASCII控制字符ASCII控制字符ASCII控制字符ASCII控制字符ASCII控制字符
0NUT16DLE32空格48064@80P96112p
1SOH17DCI33!49165A81Q97a113q
2STX18DC234"50266B82R98b114r
3ETX19DC335#51367C83S99c115s
4EOT20DC436$52468D84T100d116t
5ENQ21NAK37%53569E85U101e117u
6ACK22SYN38&54670F86V102f118v
7BEL23TB39,55771G87W103g119w
8BS24CAN40(56872H88X104h120x
9HT25EM41)57973I89Y105i121y
10LF26SUB42*58:74J90Z106j122z
11VT27ESC43+59;75K91[107k123{
12FF28FS44,60<76L92/108l124|
13CR29GS45-61=77M93]109m125}
14SO30RS46.62>78N94^110n126`
15SI31US47/63?79O95_111o127DEL
                                                                                                                               十六进制ASCII码
ASCII控制字符ASCII控制字符ASCII控制字符ASCII控制字符ASCII控制字符ASCII控制字符ASCII控制字符ASCII控制字符
0NUT10DLE20空格30040@50P6070p
1SOH11DCI21!31141A51Q61a71q
2STX12DC222"32242B52R62b72r
3ETX13DC323#33343C53S63c73s
4EOT14DC424$34444D54T64d74t
5ENQ15NAK25%35545E55U65e75u
6ACK16SYN26&36646F56V66f76v
7BEL17TB27,37747G57W67g77w
8BS18CAN28(38848H58X68h78x
9HT19EM29)39949I59Y69i79y
0ALF1ASUB2A*3A:4AJ5AZ6Aj7Az
0BVT1BESC2B+3B;4BK5B[6Bk7B{
0CFF1CFS2C,3C<4CL5C/6Cl7C|
0DCR1DGS2D-3D=4DM5D]6Dm7D}
0ESO1ERS2E.3E>4EN5E^6En7E`
0FSI1FUS2F/3F?4FO5F_6Fo7FDEL
                                                    二进制ASCII码
BinDecHex缩写/字符解释
000NUL(null)空字符
111SOH(start of headling)标题开始
1022STX (start of text)正文开始
1133ETX (end of text)正文结束
10044EOT (end of transmission)传输结束
10155ENQ (enquiry)请求
11066ACK (acknowledge)收到通知
11177BEL (bell)响铃
100088BS (backspace)退格
100199HT (horizontal tab)水平制表符
1010100ALF (NL line feed, new line)换行键
1011110BVT (vertical tab)垂直制表符
1100120CFF (NP form feed, new page)换页键
1101130DCR (carriage return)回车键
1110140ESO (shift out)不用切换
1111150FSI (shift in)启用切换
100001610DLE (data link escape)数据链路转义
100011711DC1 (device control 1)设备控制1
100101812DC2 (device control 2)设备控制2
100111913DC3 (device control 3)设备控制3
101002014DC4 (device control 4)设备控制4
101012115NAK (negative acknowledge)拒绝接收
101102216SYN (synchronous idle)同步空闲
101112317ETB (end of trans. block)传输块结束
110002418CAN (cancel)取消
110012519EM (end of medium)介质中断
11010261ASUB (substitute)替补
11011271BESC (escape)溢出
11100281CFS (file separator)文件分割符
11101291DGS (group separator)分组符
11110301ERS (record separator)记录分离符
11111311FUS (unit separator)单元分隔符
1000003220(space)空格
1000013321! 
1000103422" 
1000113523# 
1001003624$ 
1001013725% 
1001103826& 
1001113927' 
1010004028( 
1010014129) 
101010422A* 
101011432B+ 
101100442C, 
101101452D- 
101110462E. 
101111472F/ 
11000048300 
11000149311 
11001050322 
11001151333 
11010052344 
11010153355 
11011054366 
11011155377 
11100056388 
11100157399 
111010583A: 
111011593B; 
111100603C< 
111101613D= 
111110623E> 
111111633F? 
10000006440@ 
10000016541A 
10000106642B 
10000116743C 
10001006844D 
10001016945E 
10001107046F 
10001117147G 
10010007248H 
10010017349I 
1001010744AJ 
1001011754BK 
1001100764CL 
1001101774DM 
1001110784EN 
1001111794FO 
10100008050P 
10100018151Q 
10100108252R 
10100118353S 
10101008454T 
10101018555U 
10101108656V 
10101118757W 
10110008858X 
10110018959Y 
1011010905AZ 
1011011915B[ 
1011100925C\ 
1011101935D] 
1011110945E^ 
1011111955F_ 
11000009660` 
11000019761a 
11000109862b 
11000119963c 
110010010064d 
110010110165e 
110011010266f 
110011110367g 
110100010468h 
110100110569i 
11010101066Aj 
11010111076Bk 
11011001086Cl 
11011011096Dm 
11011101106En 
11011111116Fo 
111000011270p 
111000111371q 
111001011472r 
111001111573s 
111010011674t 
111010111775u 
111011011876v 
111011111977w 
111100012078x 
111100112179y 
11110101227Az 
11110111237B{ 
11111001247C| 
11111011257D} 
11111101267E~ 
11111111277FDEL (delete)删除
C语言 文本字符串和十六进制形式的相互转换一、简述 记--C语言实现 文本形式的字符串和十六进制字符串的相互转换。如"01" &lt;==&gt; "3031" 有的数据包含不可见字符,直接打印出来会不可见或残缺,需要转换为十六进制直接看ASCII码值。二、测试代码#include &lt;stdio.h&gt;#include &lt;string.h&gt;...
C语言字符串操作并不像java,Csharp那样提供直接的方法,简单粗暴。所以,在转换的时候往往费力费时,近日做项目正好用到和java程序通讯,java发送过来的数据是十六进制数字组成的字符串,解析的时候颇费心思才算完成,所以,权在此做一笔记,方便以后查看,以及需要帮助的童鞋,当然,有问题欢迎随时交流,一同进步,欧耶!~ 一、将数组转换十六进制同值的字符串 读取数组中的数字,打印成字...
在软硬件开发中,常常会遇到将字符串转16进制的需求,因为设备的中控码常见的就是Hex编码格式,也就是16进制,下面就来看下如何字符串如何转化16进制吧 二、字符串转16进制 /// <summary> /// 字符串转16进制字符 /// </summary> /// <param name="_str">字符串</param> /// <param name="encode">编码格式</param> /// <ret #define MAX_DATA_SIZE 1024 static int convert_string2hex(unsigned char *in_data, int in_data_len, unsigned char *out_data, int *out_data_len)
题目要求: 输入一个以#结束的字符串,本题要求滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”,则代表该数是负数。 输入格式: 输入在一行中给出一个以#结束的非空字符串。 输出格式: 在一行中输出转换后的十进制数。题目保证输出在长整型范围内。 输入样例1: +-P-xf4+-1!# 输出样例1: -3905 #include <stdio.h> #include <ctype.
本系列文章希望探讨以硬件为平台讲述C(C++)知识的一个新的途径,改变目前大多数C语言教程仅注重C语言本身的语法规则,而脱离其应用环境的现状。希望读者通过本教程的学习,能够立刻学以致用,真正将所学知识应用到项目实践中。 开发环境:Atmel Studio 7.0 硬件平台:Microchip AVR ATmega168PA 参考教材:C++程序设计(第3版) 谭浩强编著,清华大学出版社 此程序使用`sscanf`函数将字符串`str`转换十六进制数值,并将其存储在变量`value`中。如果转换成功,则将其作为十六进制数值输出到控制台。如果转换失败,则输出错误消息。 注意,上述程序假定输入的字符串是一个有效的十六进制数值。如果需要处理无效的输入字符串,需要添加适当的错误处理代码。