| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1031 人关注过本帖, 1 人收藏
标题:C类型转换问题
只看楼主 加入收藏
Robinson1988
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2011-8-23
收藏
得分:0 
回复 9楼 hahayezhe
还是这位哥们好,

printf("%02x")解决了显示问题。。。但是怎么存储呢?
2011-08-23 19:38
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:3 
直接 scanf("%x",...) ,然后每 4 字节逆序。
2011-08-23 19:55
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:3 
信息就是位加上下文,位(数据)符号化的东西,上下文就是确定其表示方式,它可能代表一个数字,也可能表示一个字符,也可能表示其它东西,具体要看其映射方式。在中国这个Windows版本,大多编译器会默认采用Windows 代码页 936(中文简体)这个字符编码,其中ASCII代表一个字节,宽字符(汉字)代表2个字节。这样似乎节省了一些空间(这可能也是微软采用代码页的原因),但在编程时会带来附加的麻烦。当然也可以统一使用Unicode,浪费了一小部分空间,但更简单(具体请参见Windows 程序设计第5版 第二章)。
在LZ遇到的问题中就需要进行上下文转换,C标准IO库里面已经提供了一些上下文转换的函数。

。。。。。 03003200 09008001 ffff0000 00000000 00000000 00000000 00800000
          ^这里要有一个空格,因为要略过这些字符而不使用正则表达式

好了,代码如下:
程序代码:
#include <stdio.h>

int main(void)
{
    char str[100];
    FILE * fp = fopen("filename", "r");
   
    fscanf(fp, "%*s%2x%2x", str + 36, str + 37);
    printf("%x", *(short *)(str + 36)); // 不出意外short应该为2字节
    return 0;
}
IA32 Little Endian的平台下会输出3,Big Endian会输出12c。



[ 本帖最后由 lz1091914999 于 2011-8-23 20:23 编辑 ]

My life is brilliant
2011-08-23 20:21
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
其实 unicode 是后来才有的
2011-08-23 20:33
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
回复 14楼 voidx
如果是后来才有的,那微软采用代码页的原因就是“迫不得已了”?

My life is brilliant
2011-08-23 20:39
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
代码页也不是微软的,最早是 IBM 搞的,只不过是技术的发展过程而已
这些东西不像纯技术,并不是搞出来就能用。就好像现在工厂里用的自动化技术,都是 60 多年前的技术~
谁也不敢随便换

[ 本帖最后由 voidx 于 2011-8-23 21:00 编辑 ]
2011-08-23 20:59
Robinson1988
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2011-8-23
收藏
得分:0 
回复 13楼 lz1091914999
fscanf 这个函数是一次读取一个字符吧?
因为有非常多数据要处理 多的时候上G,T 都有可能,那采用这个函数会有性能问题吧?
目前我用的时fread,一次读取8k
但是就是不知道 怎么将0c008001 按照0c 00 80 01 读出来 存成 16进制
2011-08-23 22:57
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
回复 16楼 voidx
不是Dos里的吗,Dos系统是那个公司写的。

My life is brilliant
2011-08-23 23:09
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
回复 18楼 lz1091914999
代码页只是用来描述字符的一种技术,并不依赖于操作系统。*nix, QNX,solaris,OS X 等等也都用到代码页。
因为这个东西已经被广泛使用了~没办法,大家都得兼容它

而且,ms-dos 的 cp437 其实最早是 IBM 的一套字体里面的字符 (这个是刚刚查维基知道的)。也并不存在某个操作系统叫做 "DOS"。
大家常说的 dos 指的其实是微软的 ms-dos

[ 本帖最后由 voidx 于 2011-8-24 01:15 编辑 ]
2011-08-24 00:43
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
回复 17楼 Robinson1988
你那个文件用记事本打开会不会乱码?

[ 本帖最后由 voidx 于 2011-8-24 01:05 编辑 ]
2011-08-24 00:44
快速回复:C类型转换问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013128 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved