从二进制文件中读取字节
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 个字节写回到读取它们的相同位置。
我不打算在这里写完整的东西,但我希望这能给你一个你可以从中工作的想法
我有一个二进制文件,我需要从 ( 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 个字节写回到读取它们的相同位置。
我不打算在这里写完整的东西,但我希望这能给你一个你可以从中工作的想法