Skip to content

Commit 741de06

Browse files
committed
Packet bit操作
1 parent c92d452 commit 741de06

File tree

2 files changed

+123
-51
lines changed

2 files changed

+123
-51
lines changed

src/main/java/net/siisise/io/BigBitPacket.java

Lines changed: 41 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ public long readBit(byte[] data, long offsetBit, long length) {
9191
int ofbit = (int) (offsetBit % 8);
9292

9393
if (ofbit > 0 && length >= (8 - ofbit)) {
94-
data[of] &= 0xff - andMask(8-ofbit);
94+
data[of] &= 0xff ^ andMask(8-ofbit);
9595
data[of] |= (byte) readInt(8 - ofbit);
9696
of++;
9797
length -= 8 - ofbit;
@@ -209,6 +209,15 @@ public void writeBit(int data, int bitLength) {
209209
public void writeBit(byte[] data, long offsetBit, long bitLength) {
210210
int of = (int) (offsetBit / 8);
211211
offsetBit %= 8;
212+
213+
if ( offsetBit > 0 & bitLength > (8 - offsetBit)) {
214+
int l = 8 - (int)offsetBit;
215+
int d = data[of] & 0xff;
216+
writeBit(d, l);
217+
of++;
218+
bitLength -= l;
219+
offsetBit = 0;
220+
}
212221

213222
while (offsetBit + bitLength >= 32) {
214223
writeBit(((data[of] & 0xff) << 24) | ((data[of + 1] & 0xff) << 16) | ((data[of + 2] & 0xff) << 8) | (data[of + 3] & 0xff), 32 - (int)offsetBit);
@@ -241,6 +250,11 @@ public void writeBit(byte[] data, long offsetBit, long bitLength) {
241250

242251
class BackBigBitInputStream extends BitInputStream {
243252

253+
/**
254+
* backReadInt
255+
* @param bit
256+
* @return
257+
*/
244258
@Override
245259
public int readInt(int bit) {
246260
if (bit > bitLength()) {
@@ -278,41 +292,53 @@ public int readInt(int bit) {
278292
return ret;
279293
}
280294

295+
/**
296+
* backReadBit
297+
* @param data
298+
* @param offsetBit
299+
* @param length
300+
* @return
301+
*/
281302
@Override
282303
public long readBit(byte[] data, long offsetBit, long length) {
283-
long retLength;
284-
if (length > bitLength()) {
285-
length = bitLength();
304+
long l = bitLength();
305+
if (length > l) {
306+
length = l;
286307
}
287-
retLength = length;
308+
long retLength = length;
288309
int of = (int) ((offsetBit + length) / 8);
289310
int ofbit = (int) ((offsetBit + length) % 8);
290311

291-
if ( ofbit > 0 && length > ofbit) {
292-
data[of] &= 0xff - andMask(ofbit);
293-
data[of] |= backReadInt((int)ofbit);
312+
if ( ofbit > 0 && length >= ofbit) {
313+
data[of] &= andMask(ofbit);
314+
data[of] |= readInt((int)ofbit) << (8 - ofbit);
294315
length -= ofbit;
316+
ofbit = 0;
295317
}
296318

297319
int v;
298320
while (length >= 24) {
299-
v = backReadInt(24);
321+
v = readInt(24);
300322
of -= 3;
301-
data[of] = (byte) (v & 0xff);
323+
data[of] = (byte) (v >> 16);
302324
data[of + 1] = (byte) ((v >> 8) & 0xff);
303-
data[of + 2] = (byte) (v >> 16);
325+
data[of + 2] = (byte) (v & 0xff);
304326
length -= 24;
305327
}
306328
while (length >= 8) {
307329
of--;
308-
data[of] = (byte) backReadInt(8);
330+
data[of] = (byte) readInt(8);
309331
length -= 8;
310332
}
311333

312-
if (ofbit > 0 && length >= (8 - ofbit)) { //todo: ofbit
334+
if (length > 0) { //todo: ofbit
335+
if ( ofbit > 0) {
336+
throw new java.lang.UnsupportedOperationException();
337+
}
313338
of--;
314-
data[of] &= andMask(ofbit);
315-
data[of] |= (byte)(backReadInt(8 - ofbit) << ofbit);
339+
int n = 8 - ofbit;
340+
data[of] &= 0xff ^ (andMask((int)length) << n);
341+
data[of] |= (byte) (readInt((int)length) << n);
316342
}
317343
return retLength;
318344
}

src/main/java/net/siisise/io/LittleBitPacket.java

Lines changed: 82 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public LittleBitPacket readPac(int bit) {
6565
* @param data 戻りデータ
6666
* @param offsetBit 開始ビット位置
6767
* @param length ビット長
68-
* @return
68+
* @return 読み込んだビット長
6969
*/
7070
@Override
7171
public long readBit(byte[] data, long offsetBit, long length) {
@@ -126,9 +126,10 @@ public long readBit(byte[] data, long offsetBit, long length) {
126126
}
127127

128128
/**
129-
*
130-
* @param bit 1~32ぐらい
131-
* @return 下位ビットを指定ビット分上から埋める |xx012345|
129+
* ビット読み込み.
130+
* バイト順では下位バイトが先頭
131+
* @param bit 0 から 32ぐらい 32を超える場合は先頭のみ返され残りはskipされる形
132+
* @return |xxdcba98|76543210|
132133
*/
133134
@Override
134135
public int readInt(int bit) {
@@ -168,8 +169,17 @@ public int readInt(int bit) {
168169
}
169170
}
170171

172+
/**
173+
* 逆.
174+
*/
171175
class BackLittleBitInputStream extends BitInputStream {
172176

177+
/**
178+
* 逆ビット読み込み.
179+
* 書き込んだ方向から読み込む
180+
* @param bit 0 から 32ぐらい
181+
* @return
182+
*/
173183
@Override
174184
public int readInt(int bit) {
175185
if (bit > bitLength()) {
@@ -209,50 +219,55 @@ public int readInt(int bit) {
209219
}
210220

211221
/**
212-
* ぬ?
213-
* @param data
214-
* @param offsetBit
215-
* @param length
216-
* @return
222+
* Little Endian が成立する形で背面から読み込み.
223+
*
224+
* @param data 読み込み先
225+
* @param offsetBit data bit位置
226+
* @param length bitサイズ
227+
* @return 読み込まれたbitサイズ
217228
*/
218229
@Override
219230
public long readBit(byte[] data, final long offsetBit, long length) {
220-
if (length > bitLength()) {
221-
length = bitLength();
231+
long l = bitLength();
232+
if (length > l) {
233+
length = l;
222234
}
235+
long retLength = length;
223236
int of = (int) ((offsetBit + length) / 8);
224-
int ofbit = (int) ((offsetBit + length) % 8);
237+
int ofbit = (int) ((offsetBit + length) % 8); // あまりビット
225238

226-
if (ofbit > 0 && length >= ofbit) { // まだ
239+
if (ofbit > 0 && length >= ofbit) { // 末尾は下位ビットを埋める
227240
data[of] &= andMask(8 - ofbit);
228-
data[of] |= (byte) readInt(ofbit);
229-
of++;
230-
length -= 8 - ofbit;
241+
data[of] |= (byte) readInt(ofbit) << (8 - ofbit);
242+
length -= ofbit;
231243
ofbit = 0;
232244
}
233-
//
234-
throw new java.lang.UnsupportedOperationException();
235-
/*
245+
236246
int v;
237247
while (length >= 24) {
238-
v = backReadInt(24);
239-
data[of] = (byte) (v >> 16);
248+
v = readInt(24);
249+
of -= 3;
250+
data[of] = (byte) (v & 0xff);
240251
data[of + 1] = (byte) ((v >> 8) & 0xff);
241-
data[of + 2] = (byte) (v & 0xff);
242-
of += 3;
252+
data[of + 2] = (byte) (v >> 16);
243253
length -= 24;
244254
}
245255
while (length >= 8) {
246-
data[of] = (byte) backReadInt(8);
247-
of++;
256+
of--;
257+
data[of] = (byte) readInt(8);
248258
length -= 8;
249259
}
250-
if (length > 0) {
251-
data[of] &= andMask((int) (8-length));
252-
data[of] |= (byte) (backReadInt((int) length) << (8 - length));
260+
if (length > 0) { // メモ 下位ビットから埋める // 先頭は上ビットを埋める
261+
if ( ofbit == 0 ) {
262+
of--;
263+
ofbit = 8;
264+
}
265+
int n = ofbit - (int)length;
266+
data[of] &= 0xff ^ (andMask((int) length) << n);
267+
data[of] |= (byte) (readInt((int) length) << n);
253268
}
269+
254270
return retLength;
255-
*/
256271
}
257272

258273
@Override
@@ -308,19 +323,50 @@ public void writeBit(int data, int bitLength) {
308323
}
309324
}
310325

326+
/**
327+
* 書き
328+
* @param data データ含む列
329+
* @param bitOffset ビット位置
330+
* @param bitLength ビット長
331+
*/
311332
@Override
312333
public void writeBit(byte[] data, long bitOffset, long bitLength) {
313334
int of = (int) (bitOffset / 8);
314335
int bit = (int) (bitOffset % 8);
315-
int wd = 0;
316-
int wdlen = 0;
317-
if (writePadding > 0) {
318-
wd = pac.backRead();
319-
wdlen = 8 - writePadding;
320-
writePadding = 0;
336+
337+
if (bit > 0 && bitLength >= (8 - bit)) {
338+
int d = data[of] & 0xff;
339+
writeBit(d >>> bit, 8 - bit);
340+
of++;
341+
bitLength -= bit;
342+
bit = 0;
343+
}
344+
345+
while (bit + bitLength >= 32) {
346+
writeBit((data[of] & 0xff) | ((data[of + 1] & 0xff) << 8) | ((data[of + 2] & 0xff) << 16) | ((data[of + 3] & 0xff) << 24), 32 - bit);
347+
of += 4;
348+
bitLength -= 32 - bit;
349+
bit = 0;
321350
}
322351

323-
throw new UnsupportedOperationException();
352+
while (bit + bitLength >= 16) {
353+
writeBit((data[of] & 0xff) | ((data[of + 1] & 0xff) << 8), 16 - bit);
354+
of += 2;
355+
bitLength -= 16 - bit;
356+
bit = 0;
357+
}
358+
359+
while (bit + bitLength >= 8) {
360+
writeBit(data[of] & 0xff, 8 - bit);
361+
of += 1;
362+
bitLength -= 8 - bit;
363+
bit = 0;
364+
}
365+
366+
if (bitLength > 0) {
367+
int d = data[of] & 0xff;
368+
writeBit(d >>> bit, (int)bitLength);
369+
}
324370
}
325371
}
326372

0 commit comments

Comments
 (0)