- 
                Notifications
    You must be signed in to change notification settings 
- Fork 33
Closed
Labels
Description
Hey,
I played around with you library and wanted to figure out how I can parse a sequence like one byte, then 3 bits and then one byte with Big Endian mode.
I created the following JBBP script:
byte byte1;
bit:3 bits;
byte byte2;
which generated
package org.jbbp;
import com.igormaznitsa.jbbp.model.*;
import com.igormaznitsa.jbbp.io.*;
import com.igormaznitsa.jbbp.compiler.*;
import com.igormaznitsa.jbbp.compiler.tokenizer.*;
import java.io.IOException;
import java.util.*;
/**
 * Generated from JBBP script by internal JBBP Class Source Generator
 */
public class Example {
	
	/**
	 * The Constant contains parser flags
	 * @see JBBPParser#FLAG_SKIP_REMAINING_FIELDS_IF_EOF
	 * @see JBBPParser#FLAG_NEGATIVE_EXPRESSION_RESULT_AS_ZERO
	 */
	protected static final int _ParserFlags_ = 0;
	public byte byte1;
	public byte bits;
	public byte byte2;
	
	public Example () {
	}
	public Example read(final JBBPBitInputStream In) throws IOException {
		this.byte1 = (byte)In.readByte();
		this.bits = In.readBitField(JBBPBitNumber.BITS_3);
		this.byte2 = (byte)In.readByte();
		
		return this;
	}
	public Example write(final JBBPBitOutputStream Out) throws IOException {
		Out.write(this.byte1);
		Out.writeBits(this.bits,JBBPBitNumber.BITS_3);
		Out.write(this.byte2);
		
		return this;
	}
}To test this, I used this data: 0x01a100
Binary representation:
00000001 101 00001000 00000
________ ___ ________
 ^        ^    ^ 
 |        |    byte2
 |        bits
 byte1
I want to get
byte1: 1
bits:  5
byte2: 8
but get
byte1: 1
bits:  1
byte2: 20
I used this JUnit Test:
package org.example;
import static org.assertj.core.api.Assertions.assertThat;
import com.igormaznitsa.jbbp.io.JBBPBitInputStream;
import java.io.ByteArrayInputStream;
import java.util.HexFormat;
import org.jbbp.Example;
import org.junit.jupiter.api.Test;
class ExampleTest {
  @Test
  void test() throws Exception {
    // 00000001 10100001 00000000
    var data = HexFormat.of().parseHex("01a100");
    var example = new Example();
    example.read(new JBBPBitInputStream(new ByteArrayInputStream(data)));
    var expected = new Example();
    expected.byte1 = 1; // 00000001
    expected.bits = 5;  // 00000101
    expected.byte2 = 8; // 00001000
    System.out.println("byte1: " + example.byte1);
    System.out.println("bits:  " + example.bits);
    System.out.println("byte2: " + example.byte2);
    assertThat(example).usingRecursiveComparison().isEqualTo(expected);
  }
}Can you help me to use your library to reach my expected outcome? Thank you!