2013-03-01 69 views
0

你好即时通讯尝试完成我的项目和即时通讯困惑从二进制文件读取字节。我的目标是每次读取2个字节直到EOF。我想先检查,第一个字节的第一位0或1,我想打印出像休息一样整数7位。还我想打印出第二个字节为integer.So我有这个从二进制文件读取2个字节,每次

short test[2]; 
while((fread(&test,sizeof(short),1,ifp)!=0) //ifp is input file pointer 
    { 
     fread(&test,sizeof(short),1,ifp); 
     printf("test first byte :%d\n",test[0]); 
     printf("test seocnd byte : %d\n",test[1]; 
} 

我不知道即时阅读真的还是假的,也我不能想出如何会得到即时的第一个字节的第一位和休息7有点像整数也如何即时打印出第二个字节,如整数。

日Thnx ..

+0

你读了一篇短文(两遍)。你为什么要打印两个?另外:您应该将printf的可变参数转换为int,因为%d需要一个int参数。 (可能会通过参数填充/堆栈对齐完成,但它仍然是一个马虎的习惯) – wildplasser 2013-03-01 00:17:10

+0

您应该阅读有关按位运算符。 – 2013-03-01 00:17:48

+0

是的,你们对我的双重检查。我对二进制文件有麻烦。我必须更多地研究二进制文件。 thnx – ccc 2013-03-01 00:46:42

回答

2

第二的fread是没有必要的,你不应该采取的阵列(没有&test)的地址,也需要使用字符类型是1个字节:

unsigned char test[2]; 
while((fread(test,2,1,ifp) == 1) //ifp is input file pointer 
    { 
     int first_bit = test[0] & 0x80; 
     printf("test first byte 7 bits :%d\n", test[0] & 0x7f); 
     printf("test second byte : %d\n",test[1]; 
} 
+0

好吧,我明白了。你是对的。我不需要第二次fread。是的,我也读过2次相同的数据。第一次检查怎么样?我想检查第一个字节的第一位0或1.所以对于这个问题,我可以使用 如果(测试[0]> 128)//如果它的真正的第一位必须是1正确的? – ccc 2013-03-01 00:40:07

+0

'int first_bit = test [0] & 0x80;'这样做。所以你可以做'if(test [0]&0x80)'来测试第一位是否是** set **。 – perreal 2013-03-01 00:44:40

+0

是的,我看到thnx我工作了9个小时对此我不能看到对不起。 – ccc 2013-03-01 00:58:57

1

没有人保证short是2字节,它是至少 2字节。你正在阅读一个短,并使用它和下一个。做这样的:

unsigned char test[2]; 
while((fread(&test, 1, 2, ifp) > 0) { //ifp is input file pointer 
     printf("test first byte: %u, second byte: %u\n", test[0], test[1]); 
} 

这一次读取两个字节,检查它读取的东西(返回值是读取的项目数),并打印出来。

+0

为什么我们在while循环中比较> 0?我不明白如何即时通讯在二进制文件中找到。 – ccc 2013-03-01 00:43:49

+0

因为文件结束了......并且'fread(3)'不返回EOF,所以如果没有东西可读,它将返回0。 – vonbrand 2013-03-01 00:46:49

+0

等待一分钟; while((fread(test,2,1,ifp)== 1)// ifp是输入文件指针即时混淆现在我要比较0或1? – ccc 2013-03-01 01:00:12