Chinaunix

标题: 一个简单的C类型转换问题 [打印本页]

作者: leecapacity    时间: 2012-08-16 00:27
标题: 一个简单的C类型转换问题
0123456701234567012345670123456701234567012345670123456701234567
|   ->1<-  |         -->2<--       |                    --->4<---                      |

如上所示01234567分别表示一个字节的1-8位
如果一个char 数组chbuf[8] 存放了第一行的 8*8 位数据, 第二行分别表示为1 2 4个对应的字节, 那么以下语句是否正确, 如果是错误又是为什么:
char cval = chbuf[0];
short sval = *(short *)(chbuf + 1);
int ival = *(int *)(chbuf +3);
作者: liuyang7078    时间: 2012-08-16 07:32
回复 1# leecapacity
先不说取出来可不可以 我好奇的是你是怎么把这些字节存进去的

这么做的目的在于什么,为什么不用结构体呢


   
作者: liuyang7078    时间: 2012-08-16 07:51
回复 1# leecapacity
这种类型转换是可以的 不会有问题 但是转换的时候要注意字节序的问题 另外你是char的数字 转换为short和int时要转移在字符和数之间的转换(需要查ASCII表)


   
作者: leecapacity    时间: 2012-08-16 08:09
回复 2# liuyang7078

这是我看到的一个面试的试题, 存放的是一种协议, 很有可能是网络协议, 该公司是搞网络底层研发的


   
作者: ymonster    时间: 2012-08-16 09:05
没问题~只要你清楚每个转出来的东西是什么就ok~

无非就是一个pos = 0,然后根据类型分别写转换,让pos += sizeof(T)之类的
作者: kelvin_fly    时间: 2012-08-16 10:30
回复 2# liuyang7078 我干过这事情……  不过我是fopen的二进制文件,没有用转换这些(其实俺根本就没想到转换这方面),看到您的这个回复。 俺了解了,俺是侥幸了……  话说二进制文件还是蛮好的哈。


   
作者: liuyang7078    时间: 2012-08-16 19:07
回复 4# leecapacity
这个转换是完全可以的 因为无论你存储的何种类型 表示在存储器中肯定是二进制代码 所谓的类型只是在使用的时候 人为设计的 所以 你可以往内存里写入两个char(对应两字节)然后在对应的位置读出个short 存放时会按照char的规则把字符放到一个字节里面去 读出的时候 类型是short 所以会取连续的两个字节 这个时候好像要分大小端 我昨晚测试了一个例子 然后在char和short之间做了计算 发现刚好吻合  你可以写个例子


   
作者: liuyang7078    时间: 2012-08-16 19:18
回复 6# kelvin_fly
二进制文件是不加解释直接传给调用者  文本文件也是ASCII文件 内核会把它按7位ASCII解释成字符传给调用者(因为ASCII只使用7位,还有就是ASCII文件只使用0x20-0x79 外加LF CR TAB) 这个应该是两种文件的本质不同吧


   




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2