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