字串和16進位制字串的相互轉化
轉自:http://blog.chinaunix.net/uid-20680669-id-3157274.html
我們在工作中,有時候會需要將字串轉化為16進位制字串給使用者,因為ASCII中有些字元,
當我們使用printf("%s",p_ch);輸出時會雜亂無章,如果採用16進位制,會好很多。
因此編寫程式,程式碼如下:
1.#include <stdio.h>
2.#include <string.h>
3.
4.int strToHex(char *ch, char *hex);
5.int hexToStr(char *hex, char *ch);
6.int hexCharToValue(const char ch);
7.char valueToHexCh(const int value);
8.int main(int argc, char *argv[])
9.{
10. char ch[1024];
11. char hex[1024];
12. char result[1024];
13. char *p_ch = ch;
14. char *p_hex = hex;
15. char *p_result = result;
16. printf("please input the string:");
17. scanf("%s",p_ch);
18.
19. strToHex(p_ch,p_hex);
20. printf("the hex is:%s\n",p_hex);
21. hexToStr(p_hex, p_result);
22. printf("the string is:%s\n", p_result);
23. return 0;
24.}
25.
26.int strToHex(char *ch, char *hex)
27.{
28. int high,low;
29. int tmp = 0;
30. if(ch == NULL || hex == NULL){
31. return -1;
32. }
33.
34. if(strlen(ch) == 0){
35. return -2;
36. }
37.
38. while(*ch){
39. tmp = (int)*ch;
40. high = tmp >> 4;
41. low = tmp & 15;
42. *hex++ = valueToHexCh(high); //先寫高位元組
43. *hex++ = valueToHexCh(low); //其次寫低位元組
44. ch++;
45. }
46. *hex = '\0';
47. return 0;
48.}
49.
50.int hexToStr(char *hex, char *ch)
51.{
52. int high,low;
53. int tmp = 0;
54. if(hex == NULL || ch == NULL){
55. return -1;
56. }
57.
58. if(strlen(hex) %2 == 1){
59. return -2;
60. }
61.
62. while(*hex){
63. high = hexCharToValue(*hex);
64. if(high < 0){
65. *ch = '\0';
66. return -3;
67. }
68. hex++; //指標移動到下一個字元上
69. low = hexCharToValue(*hex);
70. if(low < 0){
71. *ch = '\0';
72. return -3;
73. }
74. tmp = (high << 4) + low;
75. *ch++ = (char)tmp;
76. hex++;
77. }
78. *ch = '\0';
79. return 0;
80.}
81.
82.int hexCharToValue(const char ch){
83. int result = 0;
84. //獲取16進位制的高位元組位資料
85. if(ch >= '0' && ch <= '9'){
86. result = (int)(ch - '0');
87. }
88. else if(ch >= 'a' && ch <= 'z'){
89. result = (int)(ch - 'a') + 10;
90. }
91. else if(ch >= 'A' && ch <= 'Z'){
92. result = (int)(ch - 'A') + 10;
93. }
94. else{
95. result = -1;
96. }
97. return result;
98.}
99.
100.char valueToHexCh(const int value)
101.{
102. char result = '\0';
103. if(value >= 0 && value <= 9){
104. result = (char)(value + 48); //48為ascii編碼的‘0’字元編碼值
105. }
106. else if(value >= 10 && value <= 15){
107. result = (char)(value - 10 + 65); //減去10則找出其在16進位制的偏移量,65為ascii的'A'的字元編碼值
108. }
109. else{
110. ;
111. }
112.
113. return result;
114.}
程式碼經過編譯,執行如下:
$ gcc conver.c
c$ ./a.out
please input the string:!@#$%^&*()_+~`1234567890-=
the hex is:21402324255E262A28295F2B7E60313233343536373839302D3D
the string is:!@#$%^&*()_+~`1234567890-=
經測試,本程式碼如果輸入中含有空格,則空格以後的字串無法進行轉化
測試的環境:
編譯器: gcc 4.4.3
作業系統:ubuntu 10.04.4
核心版本:2.6.32-40-generic
相關文章
- C# 解析16進位制字串。將16進位制字串轉換成明文字串C#字串
- 16進位制字串轉位元組字串
- 位元組流轉16進位制字串字串
- Java 16進位制字串 取反Java字串
- [20190819]如何快速轉換16進位制串到字串.txt字串
- 二進位制、十進位制與十六進位制相互轉化
- C++資料格式化5 - uint轉換成十六進位制字串&二進位制的data列印成十六進位制字串C++UI字串
- 二進位制,八進位制,十進位制,十六進位制的相互轉換
- 教你如何進行數倉字串、二進位制、十六進位制互轉字串
- JAVA 學習(一):16進位制字串自增的實現Java字串
- Python 漢字區位碼、字串 相互轉換Python字串
- stoi字串轉十進位制數越界問題字串
- 口算 16 進位制轉換 10 進位制,但只適合兩位的 16 進位制
- JAVA 二進位制,八進位制,十六進位制,十進位制間進行相互轉換Java
- 請問一下如何將字串轉二進位制?字串
- C++資料格式化6 - uint轉換成二六進位制字串C++UI字串
- JSON字串與HashMap相互轉換JSON字串HashMap
- Java中8進位制和16進位制的表示方法Java
- [顏色進位制轉換]js實現rgb和hex的相互轉換JS
- 負數補碼(16進位制轉10進位制的負數)
- .C++整數的N進位制字串表示C++字串
- C++實現任意進位制的相互轉換C++
- oracle_16進位制與10進位制轉換小示例Oracle
- verilog實現格雷碼和二進位制碼的相互轉換
- JavaScript 十六進位制顏色和RGB顏色值的相互轉換JavaScript
- java 字串與檔案相互轉換Java字串
- Golang 陣列和字串之間的相互轉換[]byte/stringGolang陣列字串
- PHP負數轉16進位制再轉到10進位制的正確姿勢PHP
- 資料轉換-16進位制字元字元
- C#中JSON字串和Dictionary字典型別的相互轉換C#JSON字串型別
- 進位制之間的轉換之“十六進位制 轉 十進位制 轉 二進位制 方案”
- 陣列與字串方法與相互轉換陣列字串
- c++ 16進位制資料轉doubleC++
- 僅做筆記用:base64字串轉換為十六進位制形式表示的二進位制資料筆記字串
- Qt進位制轉換(十進位制轉十六進位制)QT
- WebSocket系列之JavaScript字串如何與二進位制資料間進行互相轉換WebJavaScript字串
- [二進位制漏洞]PWN學習之格式化字串漏洞 Linux篇字串Linux
- JavaScript陣列與字串相互轉換 join、splitJavaScript陣列字串
- mysql時間與字串之間相互轉換MySql字串