Skip to content

Commit 8d17109

Browse files
committed
bitPacket
1 parent 4b86fd2 commit 8d17109

File tree

4 files changed

+97
-92
lines changed

4 files changed

+97
-92
lines changed

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

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2019-2022 Siisise Net.
2+
* Copyright 2019-2024 Siisise Net.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -29,10 +29,11 @@ public BigBitPacket del(long index, byte[] buf, int offset, int length) {
2929
}
3030

3131
class BigBitInputStream extends BitInputStream {
32+
3233
/**
33-
*
34+
* ビット読み込み.
3435
* @param bit 1~32ぐらい
35-
* @return 下位ビットを指定ビット分上から埋める |xx012345|
36+
* @return 下位ビットを指定ビット分上から埋める |xx012345|6789abcd|
3637
*/
3738
@Override
3839
public int readInt(int bit) {
@@ -210,15 +211,6 @@ public void writeBit(byte[] data, long offsetBit, long bitLength) {
210211
int of = (int) (offsetBit / 8);
211212
offsetBit %= 8;
212213

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-
}
221-
222214
while (offsetBit + bitLength >= 32) {
223215
writeBit(((data[of] & 0xff) << 24) | ((data[of + 1] & 0xff) << 16) | ((data[of + 2] & 0xff) << 8) | (data[of + 3] & 0xff), 32 - (int)offsetBit);
224216
of += 4;

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,18 @@
2525
public interface BitPacket extends FrontPacket,BackPacket {
2626

2727
/**
28+
* ビット読み込み.
29+
* 下位ビットを利用
30+
* @param bitLength 読み込むビットサイズ 0 - 32
31+
* @return 下位ビットに読み込み
32+
*/
33+
int readInt(int bitLength);
34+
/**
35+
* 逆読み.
2836
*
2937
* @param bitLength
3038
* @return
3139
*/
32-
int readInt(int bitLength);
3340
int backReadInt(int bitLength);
3441

3542
/**

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

Lines changed: 82 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,58 @@
1919
* little endian か?
2020
* 最下位ビットが先頭 |76543210|fedcba98|
2121
* byte列は左詰め?、intは右詰め
22+
*
2223
* @deprecated テストはしていないかもしれない
2324
*/
2425
@Deprecated
2526
public class LittleBitPacket extends BaseBitPac {
2627

2728
class LittleBitInputStream extends BitInputStream {
2829

30+
/**
31+
* ビット読み込み.
32+
* バイト順では下位バイトが先頭
33+
*
34+
* @param bit 0 から 32ぐらい 32を超える場合は先頭のみ返され残りはskipされる形
35+
* @return |xxdcba98|76543210|
36+
*/
37+
@Override
38+
public int readInt(int bit) {
39+
if (bit > bitLength()) {
40+
throw new java.lang.IndexOutOfBoundsException();
41+
}
42+
int ret = 0;
43+
int flen = 8 - readPadding;
44+
if (bit >= flen) { // そのまま
45+
ret = (int) ((pac.read() >> readPadding) & andMask(flen));
46+
bit -= flen;
47+
readPadding = 0;
48+
}
49+
int len = (int) bit / 8;
50+
if (len > 0) {
51+
byte[] d = new byte[len];
52+
pac.read(d);
53+
for (byte x : d) {
54+
ret |= (x & 0xff) << flen;
55+
flen += 8;
56+
}
57+
bit -= len * 8;
58+
}
59+
if (bit > 0) { // bit = 1~7 ビット構造で異なる
60+
int d = ((pac.read() >> readPadding) & andMask(bit)) << flen;
61+
readPadding += bit;
62+
ret |= d;
63+
if (pac.length() == 0 && readPadding + writePadding == 8) {
64+
readPadding = 0;
65+
writePadding = 0;
66+
} else {
67+
d &= andMask(8 - readPadding) << bit;
68+
pac.backWrite(d);
69+
}
70+
}
71+
return ret;
72+
}
73+
2974
@Override
3075
public LittleBitPacket readPac(int bit) {
3176
if (bit > bitLength()) {
@@ -54,14 +99,15 @@ public LittleBitPacket readPac(int bit) {
5499
}
55100
if (bit > 0) { // bit = 1~7 ビット構造で異なる
56101
int d = readInt(bit);
57-
bp.writeBit(d,bit);
102+
bp.writeBit(d, bit);
58103
}
59104
return bp;
60105
}
61106

62107
/**
63108
* readのビット版 入れ物はbyte列
64109
* 右詰め |76543210|fedcba98|
110+
*
65111
* @param data 戻りデータ
66112
* @param offsetBit 開始ビット位置
67113
* @param length ビット長
@@ -76,14 +122,14 @@ public long readBit(byte[] data, long offsetBit, long length) {
76122
retLength = length;
77123
int of = (int) (offsetBit / 8);
78124
int ofbit = (int) (offsetBit % 8);
79-
80-
if ( ofbit > readPadding ) {
81-
// throw new UnsupportedOperationException();
82-
} else if ( ofbit == readPadding ) {
83-
byte[] sd = new byte[(int)((length + readPadding + 7) / 8)];
125+
126+
if (ofbit > readPadding) {
127+
// throw new UnsupportedOperationException();
128+
} else if (ofbit == readPadding) {
129+
byte[] sd = new byte[(int) ((length + readPadding + 7) / 8)];
84130
pac.read(sd);
85-
sd[0] |= (byte) (data[of] & (0xff - andMask(8-ofbit)));
86-
System.arraycopy(sd,0,data,of, (int) ((length + readPadding) / 8));
131+
sd[0] |= (byte) (data[of] & (0xff - andMask(8 - ofbit)));
132+
System.arraycopy(sd, 0, data, of, (int) ((length + readPadding) / 8));
87133
long l = ((length + readPadding) / 8) * 8;
88134
length -= l - readPadding;
89135
offsetBit += l;
@@ -92,12 +138,12 @@ public long readBit(byte[] data, long offsetBit, long length) {
92138
readPadding = 0;
93139
retLength += l;
94140
} else {
95-
// throw new UnsupportedOperationException();
141+
// throw new UnsupportedOperationException();
96142
}
97143

98144
if (ofbit > 0 && length >= (8 - ofbit)) {
99145
data[of] &= andMask(ofbit);
100-
data[of] |= (byte)(readInt(8 - ofbit) << ofbit);
146+
data[of] |= (byte) (readInt(8 - ofbit) << ofbit);
101147
of++;
102148
length -= 8 - ofbit;
103149
ofbit = 0;
@@ -119,54 +165,11 @@ public long readBit(byte[] data, long offsetBit, long length) {
119165
}
120166

121167
if (length > 0) {
122-
data[of] &= andMask(ofbit) | (0xff - andMask((int) length+ofbit));
123-
data[of] |= readInt((int)length) << ofbit;
168+
data[of] &= andMask(ofbit) | (0xff - andMask((int) length + ofbit));
169+
data[of] |= readInt((int) length) << ofbit;
124170
}
125171
return retLength;
126172
}
127-
128-
/**
129-
* ビット読み込み.
130-
* バイト順では下位バイトが先頭
131-
* @param bit 0 から 32ぐらい 32を超える場合は先頭のみ返され残りはskipされる形
132-
* @return |xxdcba98|76543210|
133-
*/
134-
@Override
135-
public int readInt(int bit) {
136-
if (bit > bitLength()) {
137-
throw new java.lang.IndexOutOfBoundsException();
138-
}
139-
int ret = 0;
140-
int flen = 8 - readPadding;
141-
if (bit >= flen) { // そのまま
142-
ret = (int) ((pac.read() >> readPadding) & andMask(flen));
143-
bit -= flen;
144-
readPadding = 0;
145-
}
146-
int len = (int) bit / 8;
147-
if (len > 0) {
148-
byte[] d = new byte[len];
149-
pac.read(d);
150-
for (byte x : d) {
151-
ret |= (x & 0xff) << flen;
152-
flen += 8;
153-
}
154-
bit -= len * 8;
155-
}
156-
if (bit > 0) { // bit = 1~7 ビット構造で異なる
157-
int d = ((pac.read() >> readPadding) & andMask(bit)) << flen;
158-
readPadding += bit;
159-
ret |= d;
160-
if (pac.length() == 0 && readPadding + writePadding == 8) {
161-
readPadding = 0;
162-
writePadding = 0;
163-
} else {
164-
d &= andMask(8 - readPadding) << bit;
165-
pac.backWrite(d);
166-
}
167-
}
168-
return ret;
169-
}
170173
}
171174

172175
/**
@@ -177,8 +180,9 @@ class BackLittleBitInputStream extends BitInputStream {
177180
/**
178181
* 逆ビット読み込み.
179182
* 書き込んだ方向から読み込む
183+
*
180184
* @param bit 0 から 32ぐらい
181-
* @return
185+
* @return
182186
*/
183187
@Override
184188
public int readInt(int bit) {
@@ -220,7 +224,7 @@ public int readInt(int bit) {
220224

221225
/**
222226
* Little Endian が成立する形で背面から読み込み.
223-
*
227+
*
224228
* @param data 読み込み先
225229
* @param offsetBit data bit位置
226230
* @param length bitサイズ
@@ -258,22 +262,22 @@ public long readBit(byte[] data, final long offsetBit, long length) {
258262
length -= 8;
259263
}
260264
if (length > 0) { // メモ 下位ビットから埋める // 先頭は上ビットを埋める
261-
if ( ofbit == 0 ) {
265+
if (ofbit == 0) {
262266
of--;
263267
ofbit = 8;
264268
}
265-
int n = ofbit - (int)length;
269+
int n = ofbit - (int) length;
266270
data[of] &= 0xff ^ (andMask((int) length) << n);
267271
data[of] |= (byte) (readInt((int) length) << n);
268272
}
269273

270274
return retLength;
271275
}
272-
276+
273277
@Override
274278
public LittleBitPacket readPac(int bitLength) {
275-
byte[] tmp = new byte[(bitLength+7) / 8];
276-
readBit(tmp,0,bitLength);
279+
byte[] tmp = new byte[(bitLength + 7) / 8];
280+
readBit(tmp, 0, bitLength);
277281
LittleBitPacket p = new LittleBitPacket();
278282
p.writeBit(tmp, 0, bitLength);
279283
return p;
@@ -307,7 +311,7 @@ public void writeBit(int data, int bitLength) {
307311
}
308312
}
309313

310-
if ( bitLength >= 8 ) {
314+
if (bitLength >= 8) {
311315
byte[] b = new byte[bitLength / 8];
312316
int i = 0;
313317
while (bitLength >= 8) {
@@ -325,6 +329,7 @@ public void writeBit(int data, int bitLength) {
325329

326330
/**
327331
* 書き
332+
*
328333
* @param data データ含む列
329334
* @param bitOffset ビット位置
330335
* @param bitLength ビット長
@@ -333,22 +338,23 @@ public void writeBit(int data, int bitLength) {
333338
public void writeBit(byte[] data, long bitOffset, long bitLength) {
334339
int of = (int) (bitOffset / 8);
335340
int bit = (int) (bitOffset % 8);
336-
341+
342+
/*
337343
if (bit > 0 && bitLength >= (8 - bit)) {
338344
int d = data[of] & 0xff;
339345
writeBit(d >>> bit, 8 - bit);
340346
of++;
341347
bitLength -= bit;
342348
bit = 0;
343349
}
344-
350+
*/
345351
while (bit + bitLength >= 32) {
346352
writeBit((data[of] & 0xff) | ((data[of + 1] & 0xff) << 8) | ((data[of + 2] & 0xff) << 16) | ((data[of + 3] & 0xff) << 24), 32 - bit);
347353
of += 4;
348354
bitLength -= 32 - bit;
349355
bit = 0;
350356
}
351-
357+
352358
while (bit + bitLength >= 16) {
353359
writeBit((data[of] & 0xff) | ((data[of + 1] & 0xff) << 8), 16 - bit);
354360
of += 2;
@@ -362,10 +368,10 @@ public void writeBit(byte[] data, long bitOffset, long bitLength) {
362368
bitLength -= 8 - bit;
363369
bit = 0;
364370
}
365-
371+
366372
if (bitLength > 0) {
367373
int d = data[of] & 0xff;
368-
writeBit(d >>> bit, (int)bitLength);
374+
writeBit(d >>> bit, (int) bitLength);
369375
}
370376
}
371377
}
@@ -378,7 +384,7 @@ class BackLittleBitOutputStream extends BitOutputStream {
378384
/**
379385
* 簡単な int, long
380386
* |76543210|fedbca98|
381-
*
387+
*
382388
* @param data データ
383389
* @param bitLength 書き込みビット長
384390
*/
@@ -418,7 +424,7 @@ public void writeBit(int data, int bitLength) {
418424

419425
/**
420426
* backWriteBit
421-
*
427+
*
422428
* @param data data
423429
* @param bitOffset ビット位置
424430
* @param bitLength ビット長
@@ -438,9 +444,9 @@ public void writeBit(byte[] data, long bitOffset, long bitLength) {
438444
int v;
439445
while (bitLength >= 24) {
440446
of -= 3;
441-
v = (data[of] & 0xff)
442-
| ((data[of+1] & 0xff) << 8)
443-
| ((data[of+2] & 0xff) << 16);
447+
v = ( data[of] & 0xff )
448+
| ((data[of + 1] & 0xff) << 8)
449+
| ((data[of + 2] & 0xff) << 16);
444450
writeBit(v, 24);
445451
bitLength -= 24;
446452
}
@@ -450,12 +456,12 @@ public void writeBit(byte[] data, long bitOffset, long bitLength) {
450456
bitLength -= 8;
451457
}
452458
if (bitLength > 0) { // メモ 下位ビットから埋める // 先頭は上ビットを埋める
453-
if ( ofbit == 0 ) {
459+
if (ofbit == 0) {
454460
of--;
455461
ofbit = 8;
456462
}
457-
int n = ofbit - (int)bitLength;
458-
writeBit(data[of] >> n, (int)bitLength);
463+
int n = ofbit - (int) bitLength;
464+
writeBit(data[of] >> n, (int) bitLength);
459465
}
460466
}
461467
}
@@ -474,7 +480,6 @@ public LittleBitPacket readPacket(long length) {
474480
return lp;
475481
}
476482

477-
478483
@Override
479484
public LittleBitPacket backReadPacket(long length) {
480485
LittleBitPacket bp = new LittleBitPacket();

0 commit comments

Comments
 (0)