LinuxSir.cn,穿越时空的Linuxsir!

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

问一个简单的问题:如何一次读出内存中一个字节的二进制数据出来

[复制链接]
发表于 2004-12-9 16:33:26 | 显示全部楼层 |阅读模式
如何将内存中一个字节的二进制数据读出来,如果用一个int变量来装, 那么高24位为零,如果用一个unsigned short来装,要去掉高8位,如果用char 来装,那么内存中的该字节将变成ascii码,问题是怎么读,用sizeof(char),或是sizeof(unsigned char), sizeof(unsigned short), sizeof(int)?
发表于 2004-12-9 19:00:30 | 显示全部楼层
内核里面应该是用unsigned char *表示内存的。

> 如果用char 来装,那么内存中的该字节将变成ascii码
char/unsigned char在内存中当然还是0101格式的,所谓ascii也是将其值定义为一个表格而已。
所以可以用unsignec char *得到内存地址,然后进行一个转换。
如:

  1. void dump_int(unsigned char *p);
  2. int main(void)
  3. {

  4.   int data;
  5.   unsigned char *p = (unsigned char *)&data;

  6.   data = 11;
  7.   dump_int(p);
  8.   data = -11;
  9.   dump_int(p);

  10.   return 0;
  11. }

  12. void dump_int(unsigned char *p)
  13. {
  14.   unsigned char c;
  15.   int i, j;

  16.   for (i = 0; i < sizeof(int)/sizeof(unsigned char); i++) {
  17.     c = *p++;
  18.     for (j = 0; j < 8; j++) {
  19.       printf("%d ", (c & (1 << j)) >> j);
  20.     }
  21.     printf("\t");
  22.   }
  23.   printf("\n");
  24. }
复制代码
发表于 2004-12-9 19:07:10 | 显示全部楼层
这个unsigned char就当他是二进制的。
不信dump出来看看

  1. void dump_byte(unsigned char *p)
  2. {
  3.   int i;
  4.   unsigned char c;

  5.   c = *p;

  6.   for (i = 0; i < 8; i++) {
  7.     printf("%d", (c & (1 << i)) >> i);
  8.   }
  9.   printf("\n");
  10. }
复制代码
发表于 2004-12-9 19:18:35 | 显示全部楼层
在debian的procps源码里面看到这么一个函数

  1. void hex_dump(void *vp){
  2.   char *charlist;
  3.   int i = 0;
  4.   int line = 45;
  5.   char *cp = (char *)vp;

  6.   while(line--){
  7.       printf("%8lx  ", (unsigned long)cp);
  8.       charlist = cp;
  9.       cp += 16;
  10.       for(i=0; i<16; i++){
  11.         if((charlist[i]>31) && (charlist[i]<127)){
  12.           printf("%c", charlist[i]);
  13.         }else{
  14.           printf(".");
  15.         }
  16.       }
  17.       printf(" ");
  18.       for(i=0; i<16; i++) printf(" %2x",(unsigned int)((unsigned char)(charlist[i])));
  19.       printf("\n");
  20.       i=0;
  21.   }
  22. }
复制代码

原来直接char就可以了。
发表于 2004-12-9 19:21:02 | 显示全部楼层
不管是有符号还是没符号,内存中的数据表示是不变的,只是对它的解释变了。
发表于 2004-12-9 19:41:34 | 显示全部楼层
对, signed & unsigned只是对数据的解释不同,即认为某一位是符号(signed)或者是数据(unsigned).
但这一位的数值是不会变的。
发表于 2004-12-9 21:53:35 | 显示全部楼层
信息等于数据加上对数据的解释,呵呵。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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