找回密码
 注册
查看: 543|回复: 9

请教大家一个关于c方面的问题!急急急!

[复制链接]
发表于 2004-11-18 16:49:58 | 显示全部楼层 |阅读模式
    
编程时候要从内存中读取数据,把原来的2位short解析成2个char读了进来!请问怎么把这2个char转成原来的short值!
例如:char a[]="abcd,a"; “,a"原来是一个short型的整数!现在被读做了char型!现在怎么转换",a"为原来的short型!
我想到的是这样:char b[10];

snprintf(b,"%x%x",(short)a[4],(short)a[5]);
short i = strtol(b,NULL,16);
这样就转换回来了,不知道大家有没有更好的办法,C中关于进制之间的转换有没有函数支持啊!
发表于 2004-11-18 17:00:38 | 显示全部楼层
试一下这个
a=12, b=34, 要得到 i = 1234;
[code:1]
char a=12, b=34;
short i = ((short)a)<<8 + b;
[/code:1]
回复

使用道具 举报

 楼主| 发表于 2004-11-18 17:08:26 | 显示全部楼层
不是这个意思啊!象",a"原来是 2c 61 存在内存中,读进到字符数组中是"44,97"
现在要得到的是当2c61做为是short型的时候的值应该是:11361
怎么写这个转换比较的简单????   
回复

使用道具 举报

发表于 2004-11-18 17:21:30 | 显示全部楼层
我想可以直接在char 与 unsigned short间转换
回复

使用道具 举报

 楼主| 发表于 2004-11-18 17:28:33 | 显示全部楼层
但是字符串怎么转换啊!
比如:",a"这个串在short型时候是代表11361!怎么写这个转换!不理解啊!楼上的解释好像行不通啊!
回复

使用道具 举报

发表于 2004-11-18 17:33:44 | 显示全部楼层
在c里面, char就是一个8位的int型

a = 'a';

你用
printf("char a =%c\n", a);
你再用
printf("hex a = %2x\n", a);

看看结果
回复

使用道具 举报

 楼主| 发表于 2004-11-18 17:39:12 | 显示全部楼层
楼上的,这些我都知道的,问题是怎么把字符串转出short型!就像上面说的
,a 要得到的值应该是11361,它的16进制是2c61,也就是,a 的ascii 码:44 97
转成16进制之后,再转出10进制输出2位的short型:111361
回复

使用道具 举报

发表于 2004-11-18 18:19:05 | 显示全部楼层
我没有太明白你的意思

看看这样

char a[]=".a";
short i;
i = ntohs(*((short*)a));

printf("i = %d\n", i);
回复

使用道具 举报

 楼主| 发表于 2004-11-18 18:58:38 | 显示全部楼层
谢谢了!好像不用你的那个函数这样就可以了! i= *((short*)a; 这是不是把原来是字符型的地址去2个给解析成short型啊!能不能解释一下!
回复

使用道具 举报

发表于 2004-11-18 19:51:08 | 显示全部楼层
不用ntohs答案是对的, 只说明,你系统的有关数组的分配策略和我的是相反的, 就是看把a0放在高地址,a1放在低地址,还是相反的分配。(ntohs只是把两个byte的次序打一个颠倒)

思路是这样的
a是一个地址, 编译器把它标志成 指向8位值(char), 当你取值时,根据标志,只是取了一个btye, 现在,我把它强行转为(short *), 再取值(*),因为short是16位的,所以就取道了2个byte

a 地址 (同时是a0的地址) 指向8位值的地址(因为声明为char)
(short *)a  把a强行转为指向一个16位值的地址
*((short *)a)  现在取出这个16位的值

实践中,只有在特殊的地方才会用到, 一般是不要这么用的,一个是代码可读性差,
二是容易出错,出了错,还很难找到原因

你理解的反了,是先转成short型, 再取两个
回复

使用道具 举报

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

本版积分规则

GMT+8, 2025-2-11 22:01 , Processed in 0.041037 second(s), 15 queries .

© 2001-2025 Discuz! Team. Powered by Discuz! X3.5.

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