@@ -65,7 +65,7 @@ public LittleBitPacket readPac(int bit) {
65
65
* @param data 戻りデータ
66
66
* @param offsetBit 開始ビット位置
67
67
* @param length ビット長
68
- * @return
68
+ * @return 読み込んだビット長
69
69
*/
70
70
@ Override
71
71
public long readBit (byte [] data , long offsetBit , long length ) {
@@ -126,9 +126,10 @@ public long readBit(byte[] data, long offsetBit, long length) {
126
126
}
127
127
128
128
/**
129
- *
130
- * @param bit 1~32ぐらい
131
- * @return 下位ビットを指定ビット分上から埋める |xx012345|
129
+ * ビット読み込み.
130
+ * バイト順では下位バイトが先頭
131
+ * @param bit 0 から 32ぐらい 32を超える場合は先頭のみ返され残りはskipされる形
132
+ * @return |xxdcba98|76543210|
132
133
*/
133
134
@ Override
134
135
public int readInt (int bit ) {
@@ -168,8 +169,17 @@ public int readInt(int bit) {
168
169
}
169
170
}
170
171
172
+ /**
173
+ * 逆.
174
+ */
171
175
class BackLittleBitInputStream extends BitInputStream {
172
176
177
+ /**
178
+ * 逆ビット読み込み.
179
+ * 書き込んだ方向から読み込む
180
+ * @param bit 0 から 32ぐらい
181
+ * @return
182
+ */
173
183
@ Override
174
184
public int readInt (int bit ) {
175
185
if (bit > bitLength ()) {
@@ -209,50 +219,55 @@ public int readInt(int bit) {
209
219
}
210
220
211
221
/**
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サイズ
217
228
*/
218
229
@ Override
219
230
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 ;
222
234
}
235
+ long retLength = length ;
223
236
int of = (int ) ((offsetBit + length ) / 8 );
224
- int ofbit = (int ) ((offsetBit + length ) % 8 );
237
+ int ofbit = (int ) ((offsetBit + length ) % 8 ); // あまりビット
225
238
226
- if (ofbit > 0 && length >= ofbit ) { // まだ
239
+ if (ofbit > 0 && length >= ofbit ) { // 末尾は下位ビットを埋める
227
240
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 ;
231
243
ofbit = 0 ;
232
244
}
233
- //
234
- throw new java .lang .UnsupportedOperationException ();
235
- /*
245
+
236
246
int v ;
237
247
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 );
240
251
data [of + 1 ] = (byte ) ((v >> 8 ) & 0xff );
241
- data[of + 2] = (byte) (v & 0xff);
242
- of += 3;
252
+ data [of + 2 ] = (byte ) (v >> 16 );
243
253
length -= 24 ;
244
254
}
245
255
while (length >= 8 ) {
246
- data[of] = (byte) backReadInt(8) ;
247
- of++ ;
256
+ of -- ;
257
+ data [ of ] = ( byte ) readInt ( 8 ) ;
248
258
length -= 8 ;
249
259
}
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 );
253
268
}
269
+
254
270
return retLength ;
255
- */
256
271
}
257
272
258
273
@ Override
@@ -308,19 +323,50 @@ public void writeBit(int data, int bitLength) {
308
323
}
309
324
}
310
325
326
+ /**
327
+ * 書き
328
+ * @param data データ含む列
329
+ * @param bitOffset ビット位置
330
+ * @param bitLength ビット長
331
+ */
311
332
@ Override
312
333
public void writeBit (byte [] data , long bitOffset , long bitLength ) {
313
334
int of = (int ) (bitOffset / 8 );
314
335
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 ;
321
350
}
322
351
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
+ }
324
370
}
325
371
}
326
372
0 commit comments