LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: 惠繪洋

C語言問一個初學問題

[复制链接]
发表于 2006-9-18 14:51:37 | 显示全部楼层
不需要真实的转换
字符串 s  中 存了 hello
其实你既 可以说s[0]-[4] 里面放的 是一个个字符串 h e l l o
也可以认为里面放的是一个 十六进制的数 0x68 0x65 0x6c 0x6c 0x6f

打印出来的作用只是,人一般不会背 字符与十六进制的对应关系,就打印出来看看罢了

不知道说得对不对
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-18 17:43:47 | 显示全部楼层
先謝謝各位指教,

其實我明白在機器最後都是以這2進位的方式儲存, 但我現在的想法是當hello輸入函數後, 它會返回 {0x68, 0x65, 0x6c, 0x6c, 0x6f} 給我, 或者 返回 {68, 65, 6c, 6c, 6f}
我只是這樣的...
再請各位指教小弟. 謝謝.
回复 支持 反对

使用道具 举报

发表于 2006-9-18 18:18:52 | 显示全部楼层
Post by 惠繪洋
先謝謝各位指教,

其實我明白在機器最後都是以這2進位的方式儲存, 但我現在的想法是當hello輸入函數後, 它會返回 {0x68, 0x65, 0x6c, 0x6c, 0x6f} 給我, 或者 返回 {68, 65, 6c, 6c, 6f}
我只是這樣的...
再請各位指教小弟. 謝謝.

楼主貌似问的是 sprintf 函数

  1. #include <stdio.h>

  2. void trans(char * arr, const char * str)
  3. {
  4.         int i = 0;
  5.         for(;i<strlen(str);i++)
  6.                 sprintf(arr+5*i,"0x%2x",*(str+i));
  7. }

  8. int main(int argc, char ** argv)
  9. {
  10.         int str_len = strlen(argv[1]);
  11.         char * buf = malloc(str_len*5);
  12.         int i;

  13.         memset(buf,0,str_len*5);
  14.         trans(buf,argv[1]);
  15.         for(i=0;i<5;i++)
  16.                 printf("%s ",buf+i*5);

  17.         free(buf);
  18.         printf("\n");
  19.         return 0;
  20. }
复制代码

这样, buf 里面就是楼主需要的东西
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-19 14:47:55 | 显示全部楼层
謝謝各位,
想再問問各位問題.
我有一個程序, 它可以把16進制轉換到十進制的, 並會計算它的價
但有一部份並不是太明白.

  1. int count;
  2. int m, n = 0;
  3. int input[5] = {9, 10, 15, 4};

  4. count = 4;
  5. m = 4 - 1;
  6. while( n < count)
  7. {
  8.   value = value | input[n] << (m << 2));
  9.   m--;
  10.   n++;
  11. }
复制代码


答案是 39668.
當中我並不是太明白 m << 2的用處, m 向左退2個位, 在while內分別是 12, 8, 4, 0.
而input[n] << (m << 2) 的作用又是什麼呢, 向左退12位, 8位, 4位及0位..

請各位指教.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-19 14:54:28 | 显示全部楼层
謝謝各位.
現在有一事再請教各位.
input 內存在由16進制換過來的十進制整數, 而家要把它計算出數值.
但當中有個地方並不太明白想請教各位.
  1. int count;
  2. int m, n;
  3. int input[5] = {9, 10, 15, 4);
  4. int value = 0;
  5. n = 4;
  6. count = n;
  7. m = n - 1;
  8. n = 0;
  9. while(n < count)
  10. {
  11.   value = value | input[n] << (m << 2));
  12.   m--;
  13.   n++;
  14. }
复制代码

我就是不明白, m << 2, 在向左退二位的目的. 但它的給果是 12, 8, 4, 0. 這4個數又有什麼關系呢??
再把 input[n] << (m << 2) 再向左移12, 8, 4, 0位目的又是什麼呢....
它的答案是: 39668, 即輸入16進制 0x9af4 = 39668.
請各位指教. thanks.
回复 支持 反对

使用道具 举报

发表于 2006-9-19 16:43:08 | 显示全部楼层
[php]
0x9AF4 = 0x9000 + 0x0A00 + 0x00F0 + 0x0004
           = (0x9<<12) + (0xA<<8) + (0xF<<4) + (0x4<<0 )
           = (0x9<<(3*4) + (0xA<<(2*4))) + (0xF<<(1*4)) + (0x4<<(0*4))
           = (0x9<<(3<<2) + (0xA<<(2<<2))) + (0xF<<(1<<2)) + (0x4<<(0<<2))
[/php]

这样够明白了吗? 还不明白说明你理论基础还不够, 再把书本好好看看,融会贯通以后再编程实践的话你的效率或许更高。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-19 17:27:54 | 显示全部楼层
Post by Lolita
[php]
0x9AF4 = 0x9000 + 0x0A00 + 0x00F0 + 0x0004
           = (0x9<<12) + (0xA<<8) + (0xF<<4) + (0x4<<0 )
           = (0x9<<(3*4) + (0xA<<(2*4))) + (0xF<<(1*4)) + (0x4<<(0*4))
           = (0x9<<(3<<2) + (0xA<<(2<<2))) + (0xF<<(1<<2)) + (0x4<<(0<<2))
[/php]

这样够明白了吗? 还不明白说明你理论基础还不够, 再把书本好好看看,融会贯通以后再编程实践的话你的效率或许更高。


謝謝 Lolita,
現在明白了. 一時想不通, 一個16位是等於4個二進制位.. 所以移一個就等於移了4個二進制位.
所以會得出 0x9000 = 0x9 << 12 因為移了3個位... 如此類推.. 明白了.
謝謝.

希望我這個問題能幫到相關的人呢... 如此看來我又要再多看一些深入的書才可以呢... :p
回复 支持 反对

使用道具 举报

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

本版积分规则

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