怎样将int型转化成char型写入文件系统?
我原来的程序是生成随机int型数40M,一个int一个int的写入到文件系统中
for (int i=0; i<0xA00000; i++)//40M
{
int x = rand();
fwrite(&x, sizeof(int), 1, fppattern);
}
现在要一个byte一个byte的写入到文件系统中,我这样做,生成的文件只有10M了,是不是转换有问题,是不是漏掉byte了,怎样才能让文件是40M?
for (int i=0; i<0xA00000; i++)//40M
{
int x = rand();
unsigned char m_fdata = x & 0xFF;
int p = (i*10)/0x100000;
fwrite(&m_fdata, sizeof(char), 1, fppattern);
}
[解决办法]
int 是4个byte,uchar是一个byte。
你的写法只是写了int的最后一个byte.
你可以把int分离成4个uchar再写。
分别用0xff000000,0x00ff0000,0x0000ff00,0x000000ff和int 与操作。
或者定义union
union s_int
{
int int_32;
struct
{
BYTE pat3;
BYTE pat2;
BYTE pat1;
BYTE pat0;
}byte_8;
};
这样就不需要与操作了,但要注意big endian 和 little endian的问题。
[解决办法]
你每次取int的一个字节写入,当然不可能跟int是一样大的
x & 0xFF
你只取了最低字节而已,其他三字节都没写进去
unsigned char * pc = (unsigned char*)&x;
fwrite(pc,sizeof(unsigned char),sizeof(int),pf);
这样试试,
不过这里有个byte order的问题,不知道楼主有没有要求的
也就是说0x01020304,通过unsigned char写入的时候会先写入0x04,接着0x03,0x02,0x01
[解决办法]
int i 是32位的
CHAR或者BYTE 是8位的
数据会有丢失
要把int的值用移位运算分为四个BYTE位,从高到低放入文件
如果发现BYTE写不进去,只有一种可能,那就是int值里有00的值
比如int值位0x0A00,低位的0x00是无法转型成CHAR/BYTE,因为这是终止符号
[解决办法]
比较喜欢cad_vc的做法,简单实用
我的方法
- C/C++ code
int x = rand(); int y = x&0xFF; unsigned char* m_fdata = &y; fwrite(&(m_fdata--), sizeof(char), 1, fppattern); fwrite(&(m_fdata--), sizeof(char), 1, fppattern); fwrite(&(m_fdata--), sizeof(char), 1, fppattern); fwrite(&m_fdata, sizeof(char), 1, fppattern);
