正在从二进制文件中读取字节

Reading bytes from a binary file

本文关键字:读取 字节 二进制文件      更新时间:2023-10-16

我有一个二进制文件,需要从( 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-编码是一个小endian)。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个字节写回读取的同一位置。

我不打算在这里写全部内容,但我希望这能给你一个可以在上工作的想法