从二进制文件中读取字节

Reading bytes from a binary file

我有一个二进制文件,我需要从 ( 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。我怎么能那样做??

你必须延伸到两端的字节边界,首先读取你要写的区域。所以,如果你想写两个字节,你将不得不读三个字节。

然后您将必须进行适当的位移和掩码,以将您的位放在正确的位置。

例如,如果您要写入两个字节并移位 ½ 字节,您可以这样开始:

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);

temp 中获得数据后,将 3 个字节写回到读取它们的相同位置。

我不打算在这里写完整的东西,但我希望这能给你一个你可以从中工作的想法