一、简述
记--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'; else *_hexStr = tmp-0x0a + 'A'; _hexStr++; //高4bit tmp = _hexNum & 0x0f; if(tmp <= 9) *_hexStr = tmp+'0'; else *_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'; } else { 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; i++; *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@80P96、112p1SOH17DCI33!49165A81Q97a113q2STX18DC234"50266B82R98b114r3ETX19DC335#51367C83S99c115s4EOT20DC436$52468D84T100d116t5ENQ21NAK37%53569E85U101e117u6ACK22SYN38&54670F86V102f118v7BEL23TB39,55771G87W103g119w8BS24CAN40(56872H88X104h120x9HT25EM41)57973I89Y105i121y10LF26SUB42*58:74J90Z106j122z11VT27ESC43+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@50P60、70p1SOH11DCI21!31141A51Q61a71q2STX12DC222"32242B52R62b72r3ETX13DC323#33343C53S63c73s4EOT14DC424$34444D54T64d74t5ENQ15NAK25%35545E55U65e75u6ACK16SYN26&36646F56V66f76v7BEL17TB27,37747G57W67g77w8BS18CAN28(38848H58X68h78x9HT19EM29)39949I59Y69i79y0ALF1ASUB2A*3A:4AJ5AZ6Aj7Az0BVT1BESC2B+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)设备控制1100101812DC2 (device control 2)设备控制2100111913DC3 (device control 3)设备控制3101002014DC4 (device control 4)设备控制4101012115NAK (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)删除