字串和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進位制字串轉位元組字串
- Java 16進位制字串 取反Java字串
- [MSSQL]字串轉成16進位制函式SQL字串函式
- 二進位制、十進位制與十六進位制相互轉化
- 使用Java完成byte陣列與十六進位制字串相互轉換Java陣列字串
- 字串與二進位制互相轉化(不包含漢字) (轉)字串
- 二進位制字串相加字串
- 二進位制,八進位制,十進位制,十六進位制的相互轉換
- javascript十進位制數字和二進位制相互轉換JavaScript
- 10進位制和16進位制互轉的例子
- 【進位制轉換】十進位制與十六進位制相互轉換方法
- 字串和陣列的相互轉換字串陣列
- 字串和數字的相互轉換字串
- 使用Apache的Hex類實現Hex(16進位制字串和)和位元組陣列的互轉Apache字串陣列
- (轉)【iOS 開發】二進位制、十進位制、十六進位制相互轉換的方法iOS
- 對2個hex(16進位制)字串進行異或操作字串
- 教你如何進行數倉字串、二進位制、十六進位制互轉字串
- js 62進位制和10進位制相互轉換程式碼例項JS
- 【轉帖】Oracle中的二進位制、八進位制、十進位制、十六進位制相互轉換函式Oracle函式
- JAVA 學習(一):16進位制字串自增的實現Java字串
- 一段對16進位制字串進行異或的程式碼字串
- iOS字串和陣列的相互轉換iOS字串陣列
- javascript字串和ascii碼的相互轉換JavaScript字串ASCII
- javascript數字和字串的相互轉換JavaScript字串
- Oracle中的二進位制、八進位制、十進位制、十六進位制相互轉換函式Oracle函式
- JAVA 二進位制,八進位制,十六進位制,十進位制間進行相互轉換Java
- javascript數字和字串相互轉換JavaScript字串
- 3416:【例72.1】 二進位制轉化為十進位制
- js實現的十進位制和十六進位制相互轉換程式碼例項JS
- JavaScript 進位制轉換(2進位制、8進位制、10進位制、16進位制之間的轉換)JavaScript
- 口算 16 進位制轉換 10 進位制,但只適合兩位的 16 進位制
- javascript中字串和陣列的相互轉換JavaScript字串陣列
- Delphi的嵌入式asm一例: Byte快速轉換為16進位制字串 (轉)ASM字串
- java中如何將byte[]裡面的資料轉換成16進位制字串Java字串
- SQL Server 字串和時間相互轉換SQLServer字串
- 十六進位制和RGB顏色格式的相互轉換
- 請問一下如何將字串轉二進位制?字串