Skip to content

Commit 4b86fd2

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

File tree

2 files changed

+88
-8
lines changed

2 files changed

+88
-8
lines changed

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

Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,10 @@ public void writeBit(byte[] data, long offsetBit, long bitLength) {
247247
}
248248
}
249249
}
250-
250+
251+
/**
252+
* 逆読み.
253+
*/
251254
class BackBigBitInputStream extends BitInputStream {
252255

253256
/**
@@ -294,6 +297,7 @@ public int readInt(int bit) {
294297

295298
/**
296299
* backReadBit
300+
*
297301
* @param data
298302
* @param offsetBit
299303
* @param length
@@ -358,6 +362,9 @@ public BigBitPacket readPac(int bitLength) {
358362
}
359363
}
360364

365+
/**
366+
* 逆書き込み用.
367+
*/
361368
class BackBigBitOutputStream extends BitOutputStream {
362369

363370
/**
@@ -400,12 +407,44 @@ public void writeBit(int data, int bitLength) {
400407
}
401408
}
402409

410+
/**
411+
* 逆書き.
412+
* MSB上位ビットが先頭 |01234567|89abcdef|.
413+
* @param data
414+
* @param offsetBit
415+
* @param length
416+
*/
403417
@Override
404-
public void writeBit(byte[] data, long off, long length) {
405-
if ( off % 8 != 0 ) {
406-
418+
public void writeBit(byte[] data, long offsetBit, long length) {
419+
int of = (int) ((offsetBit + length) / 8);
420+
int ofbit = (int) ((offsetBit + length) % 8);
421+
422+
if ( ofbit > 0 && length >= ofbit) {
423+
writeBit(data[of] >>> 8 - ofbit, ofbit);
424+
length -= ofbit;
425+
ofbit = 0;
426+
}
427+
428+
while (length >= 24) {
429+
of -= 3;
430+
writeBit(((data[of] << 16) & 0xff) | ((data[of + 1] << 8) & 0xff) | (data[of + 2] & 0xff), 24);
431+
length -= 24;
432+
}
433+
434+
while (length >= 8) {
435+
of--;
436+
writeBit((data[of + 2] & 0xff), 8);
437+
length -= 8;
438+
}
439+
440+
if (length > 0) {
441+
if ( ofbit == 0 ) {
442+
of--;
443+
ofbit += 8;
444+
}
445+
int n = 8 - ofbit;
446+
writeBit(data[of] >>> n, (int)length);
407447
}
408-
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
409448
}
410449
}
411450

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

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -370,14 +370,17 @@ public void writeBit(byte[] data, long bitOffset, long bitLength) {
370370
}
371371
}
372372

373+
/**
374+
* 逆書き込み.
375+
*/
373376
class BackLittleBitOutputStream extends BitOutputStream {
374377

375378
/**
376379
* 簡単な int, long
377380
* |76543210|fedbca98|
378381
*
379-
* @param data
380-
* @param bitLength
382+
* @param data データ
383+
* @param bitLength 書き込みビット長
381384
*/
382385
@Override
383386
public void writeBit(int data, int bitLength) {
@@ -413,9 +416,47 @@ public void writeBit(int data, int bitLength) {
413416
}
414417
}
415418

419+
/**
420+
* backWriteBit
421+
*
422+
* @param data data
423+
* @param bitOffset ビット位置
424+
* @param bitLength ビット長
425+
*/
416426
@Override
417427
public void writeBit(byte[] data, long bitOffset, long bitLength) {
418-
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
428+
int of = (int) ((bitOffset + bitLength) / 8);
429+
// long retLength = bitLength;
430+
int ofbit = (int) ((bitOffset + bitLength) % 8); // あまりビット
431+
432+
if (ofbit > 0 && bitLength >= ofbit) { // 末尾は下位ビットを埋める
433+
writeBit((data[of] & 0xff), ofbit);
434+
bitLength -= ofbit;
435+
ofbit = 0;
436+
}
437+
438+
int v;
439+
while (bitLength >= 24) {
440+
of -= 3;
441+
v = (data[of] & 0xff)
442+
| ((data[of+1] & 0xff) << 8)
443+
| ((data[of+2] & 0xff) << 16);
444+
writeBit(v, 24);
445+
bitLength -= 24;
446+
}
447+
while (bitLength >= 8) {
448+
of -= 1;
449+
writeBit(data[of] & 0xff, 8);
450+
bitLength -= 8;
451+
}
452+
if (bitLength > 0) { // メモ 下位ビットから埋める // 先頭は上ビットを埋める
453+
if ( ofbit == 0 ) {
454+
of--;
455+
ofbit = 8;
456+
}
457+
int n = ofbit - (int)bitLength;
458+
writeBit(data[of] >> n, (int)bitLength);
459+
}
419460
}
420461
}
421462

0 commit comments

Comments
 (0)