我有一个二进制文件,我需要存储( 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
。我怎么能这样做?
答案 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个字节写回读取的相同位置。
我不打算在这里写完整篇文章,但我希望这能为你提供一个可以从中工作的想法