从二进制文件中读取字节

时间:2016-03-25 11:37:57

标签: c++ bit-manipulation binaryfiles bitwise-operators

我有一个二进制文件,我需要存储( x, y )位置z字节数。例如,我有这个字节序列:

00000000  49  49  49  49  05  00  00  00   08  00  00  00  1a  00  00  00 | y0 
00000010  39  a6  82  f8  47  8b  b8  10   78  97  f1  73  56  d9  6f  00 | y1
00000020  58  99  d5  3b  ac  7b  7b  40   b6  2e  9f  0a  69  b2  ac  a0 | y2
          ________________________________________________________________
          x0  x1  x2  x3  x4  x5  x6  x7   x8  x9  x10 x11 x12 x13 x14 x15

每2个合并的数字代表1个字节(它取自hexdump -C - 编码是一个小端)。 49 = 1个字节,f8是1个字节等...

( x , y )表示立场。例如,如果我为x = 2,y = 2,我得到位置( 2, 2 ),这意味着我开始从位置y2,x2读取字节。在这种情况下,我从字节d5开始如果我放z = 3这意味着我想在这种情况下存储3个字节,那些字节是d5, 3b, ac

我可以通过一个简单的公式来计算位置:

position = 16 * y + x  
position = 16 * 2 + 2    // i put x = 2, y = 2 to formula
position = 34    // get number 34, that means i will start storing at 35th byte in this case it's d5
binaryFile . seekg ( position )  // jump to position in a file ( itc it's 99 )
binaryFile . read ( ( char * )&dest, z )) // save z bytes

如果我放z = 3,我将存储3个字节:d5, 3b, ac

但是系数z , x , y不是整数:

如果我放y = 2, x = 1,5 and z = 3 // ( 1,5, 2 )这意味着我必须跳过字节而不是99而是d5然后在这种情况下存储2个字节d5 , 3b并将它们添加到半字节字节99和字节ac的半字节,因为起始位置为x = 1,5。我怎么能这样做?

1 个答案:

答案 0 :(得分:2)

您必须扩展到两端的字节边界,并首先读取您要写入的区域。因此,如果要写两个字节,则必须读取三个字节。

然后你必须进行适当的位移和屏蔽才能使你的位在正确的位置。

例如,如果你要写两个字节移位½字节,你可以从这样的东西开始:

notifyDataSetChanged()

将数据存入unsigned char *mydata = MyDataToWrite(); unsigned char temp[bigEnough]; binaryFile.input(temp, 3); temp[0] = (temp[0] & 0xf0) | (mydata[0] >> 4); // more code here to put bits in temp binaryFile.output(temp, 3); 后,将3个字节写回读取的相同位置。

我不打算在这里写完整篇文章,但我希望这能为你提供一个可以从中工作的想法