LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2124|回复: 16

C語言問一個初學問題

[复制链接]
发表于 2006-9-17 16:04:27 | 显示全部楼层 |阅读模式
各位好,
我想問問用C語言怎樣能把一個字符轉為16進制呢. 我知道用 printf(%x)是可以用16進制顯示,但我需要的是把轉換後的16進制儲存起來.
若用 strtol 它只會接受由 0~9, A~F 的轉換, 但若果是 F 打後的呢.
例如, 我想把 Hello 轉由16進制並存到陣列中, 應該如何做呢?

還有, 怎樣由16進制反轉換成10進制呢, 理論我是明白的, 但實作編程就不是太清楚, 想請各位指教一下.

謝謝.
发表于 2006-9-17 16:19:44 | 显示全部楼层
F以后也可以读入的
$ man 3 strol

The  strtol()  function converts the initial part of the string in nptr
       to a long integer value according to the  given  base,  [color="Red"]which  must  be
       between 2 and 36 inclusive, or be the special value 0.
回复 支持 反对

使用道具 举报

发表于 2006-9-17 17:05:10 | 显示全部楼层
Post by 惠繪洋
各位好,


還有, 怎樣由16進制反轉換成10進制呢, 理論我是明白的, 但實作編程就不是太清楚, 想請各位指教一下.


参考一下
我写的一个demo:以10进制形式读入一个整数,然后把该整数转化为 2~36 进制的字符串输出,最核心的就是那个简单的 bin2str 函数
  1. /**************************************************
  2. file: bin2str.c
  3. author: Lolita@linuxsir.cn 2006-09-17
  4. description: demo of converting binary integer to string
  5. compile&run: gcc bin2str.c -o bin2str
  6. **************************************************/
  7. #include <stdio.h>
  8. /* buffer size for storing result string */
  9. int const MAX_LEN=64;  
  10. /* result string alphabet, base 2~36 is compatible */
  11. char const alphabet[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";  
  12. char * bin2str(char *p, int n, int base)
  13. {
  14.     while(n){
  15.         p--;
  16.         *p=alphabet[n%base];
  17.         n/=base;
  18.     }
  19.     return p;
  20. }
  21. int main()
  22. {
  23.     char str[MAX_LEN+1];
  24.     str[MAX_LEN]=0;
  25.     int test_int;
  26.     int base;
  27.     printf("\nDemo of converting binary integer to string.\n");
  28.     printf("Press Ctrl+C to quit.\n\n");
  29.    
  30.     for(;;){
  31.         do{
  32.             printf("input an UNSIGNED integer(greater than 0): ");
  33.             scanf("%d", &test_int);
  34.         }while(test_int<=0);
  35.         do{
  36.             printf("input the display base(2~36): ");
  37.             scanf("%d", &base);
  38.         }while(base<2 || base >36 );
  39.         char * p=bin2str(&str[MAX_LEN], test_int, base );
  40.         printf("the result string is: %s \n", p);
  41.     }
  42.     return 0;
  43. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-17 19:37:34 | 显示全部楼层
唔該Lolita指教.
但我仍唔係好明白
char const alphabet[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
的用處, 唔知可唔可以解釋一下呢...
其實想問, 十進制轉換成16進制, 數值,字符及字串的轉換是不是都是一樣的呢.
我最初寫了一個程序, 可以把數值strtol 轉換成16進制, 但字符/字串就想不到應該怎去做了.
請你再指教.... 因為我想學習多一些這十六進制轉換方法. 謝謝.
回复 支持 反对

使用道具 举报

发表于 2006-9-17 19:58:05 | 显示全部楼层
我唔识听广东话啦。。。

char const alphabet[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
就是字母表啊,最后整数转化为字符串时就用这个字母表的。
十進制轉換成16進制, 數值,字符及字串的轉換是不是都是一樣的呢.
当然不一样了,字符串是用来供人辩认的一种表示形式。在机器里头,只有二进制表示,其他进制都是人为规定的。 16进制和二进制之间的转化非常简易,故而常用16进制表示数值,免得一串01010。

进制之间的转化可以google一下,很容易找。
回复 支持 反对

使用道具 举报

发表于 2006-9-17 19:58:55 | 显示全部楼层
[PHP]
#include <stdio.h>

int main()
{
        char s[] = "1F"; /* "0x1F" is also OK */
        int x = 0;
        sscanf(s, "%x", (void *)&x);
        printf("x = %d\n", x);
        return 0;
}
[/PHP]
这可以读取 16 进制。不过如果想要任意进制的话,还是要自己写函数的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-17 20:35:54 | 显示全部楼层
Post by Lolita
我唔识听广东话啦。。。

char const alphabet[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
就是字母表啊,最后整数转化为字符串时就用这个字母表的。


当然不一样了,字符串是用来供人辩认的一种表示形式。在机器里头,只有二进制表示,其他进制都是人为规定的。 16进制和二进制之间的转化非常简易,故而常用16进制表示数值,免得一串01010。

进制之间的转化可以google一下,很容易找。


謝謝 lolita,
我在google找過了, 很多都是理論及進制之間的計算... 這些都明白了.
但就是不能用程序語言來實現. 可能我編寫語言能力還差呢. 所以希望你能教導一下小弟.

我想再問, 這電腦字符中, 大小寫是有分別的. 即 a 不等於 A, 為什麼字母表不需要加入小寫a~z 呢.
回复 支持 反对

使用道具 举报

发表于 2006-9-17 21:45:52 | 显示全部楼层
语言要边学边练的,不要操之过急。
字母表是随便规定的,你当然可以用小写字母代替之。但次序不能乱

你不明白的是如何在C里头实现进制转换吧?
比如 16进制 "0x1FFC"  ----> 10进制 "8188"
首先你键盘输入的 "0x1FFC" 和 屏幕输出的"8188"  都是 字符串。也就是怎么实现这个字符串之间的转换? 我想你问的是这个吧

流程是: "0x1FFC" ---> 用strtol 保存为一个整数n ----> 调用 bin2str ---> 输出字符串"8188"  
可以实现任意进制的转化
  1. /* 任意数值转化演示, 仅适合正数 */
  2. #include <stdio.h>
  3. #include <string.h>
  4. /* buffer size for storing result string */
  5. int const MAX_LEN=64;  
  6. /* result string alphabet, base 2~36 is compatible */
  7. char const alphabet[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";  
  8. char * bin2str(char *p, int n, int base)
  9. {
  10.     while(n){
  11.         p--;
  12.         *p=alphabet[n%base];
  13.         n/=base;
  14.     }
  15.     return p;
  16. }
  17. int main()
  18. {
  19.     char result_str[MAX_LEN+1];
  20.     result_str[MAX_LEN]=0;
  21.     char input_str[MAX_LEN+1];
  22.     int n;
  23.     int in_base, out_base;   
  24.     printf("input string: ");
  25.     fgets(input_str, MAX_LEN, stdin);
  26.     input_str[strlen(input_str)-1]='\0';
  27.     printf("input base(2~32): ");
  28.     scanf("%d",&in_base);
  29.     printf("output base(2~32): ");
  30.     scanf("%d",&out_base);
  31.     n=strtol(input_str, NULL, in_base);
  32.     char *p=bin2str(result_str, n, out_base);
  33.     printf("%s (base %d) ---> %s (base %d) \n", input_str,in_base, p, out_base);
  34. }
复制代码
~/coding/c $ ./a.out
input string: 0x1ffc
input base(2~32): 16
output base(2~32): 10
0x1ffc (base 16) ---> 8188 (base 10)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-17 23:24:18 | 显示全部楼层
Post by Lolita
语言要边学边练的,不要操之过急。
字母表是随便规定的,你当然可以用小写字母代替之。但次序不能乱

你不明白的是如何在C里头实现进制转换吧?
比如 16进制 "0x1FFC"  ----> 10进制 "8188"
首先你键盘输入的 "0x1FFC" 和 屏幕输出的"8188"  都是 字符串。也就是怎么实现这个字符串之间的转换? 我想你问的是这个吧

流程是: "0x1FFC" ---> 用strtol 保存为一个整数n ----> 调用 bin2str ---> 输出字符串"8188"  
可以实现任意进制的转化


謝謝lolita,
我明白你的指教. 而且整數轉做16進制及2進制的設計多少我現在明白了.
但最令我不明白的如何把字串或者字符轉成16進制,
即如我輸入 hello, 我想把 h, e, l, l, o這5個字符的16進制碼記下到陣列內.
我知printf(%x)可以做到顯示效果, 但我要的不是顯示, 而是真實的轉換.
這又要請你再指教了.
謝謝.
回复 支持 反对

使用道具 举报

发表于 2006-9-18 10:27:41 | 显示全部楼层
什么叫真实的转换? 计算机里头一切都是二进制方式存储,没有其他进制的存储。
转换都是逻辑上的,不是物理上的。

要看字符串到数值的转换,可以参考strtol的源码,不必重复制造轮子
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表