improven JBON format using the marker byte to include the size of small

string,arrays or objects
This commit is contained in:
Walter Oggioni
2019-07-16 18:30:07 +02:00
committed by Walter Oggioni
parent a2e5e669f1
commit 354c58fd66
3 changed files with 39 additions and 24 deletions

View File

@@ -15,8 +15,8 @@ public enum BinaryMarker {
EmptyArray(0xaf),
LargeArray(0xff);
public byte value;
public int value;
BinaryMarker(int b) {
value = (byte) b;
value = b;
}
}

View File

@@ -94,6 +94,8 @@ public class JBONDumper extends ValueDumper {
protected void beginObject(int size) {
if(size == 0) {
os.write(BinaryMarker.EmptyObject.value);
} else if(size < BinaryMarker.LargeObject.value - BinaryMarker.EmptyObject.value) {
os.write(BinaryMarker.EmptyObject.value + size);
} else {
os.write(BinaryMarker.LargeObject.value);
Leb128.encode(os, size);
@@ -110,6 +112,8 @@ public class JBONDumper extends ValueDumper {
protected void beginArray(int size) {
if(size == 0) {
os.write(BinaryMarker.EmptyArray.value);
} else if(size < BinaryMarker.LargeArray.value - BinaryMarker.EmptyArray.value) {
os.write(BinaryMarker.EmptyArray.value + size);
} else {
os.write(BinaryMarker.LargeArray.value);
Leb128.encode(os, size);
@@ -135,10 +139,15 @@ public class JBONDumper extends ValueDumper {
if(value.isEmpty()) {
os.write(BinaryMarker.EmptyString.value);
} else {
os.write(BinaryMarker.LargeString.value);
byte[] bytes = value.getBytes();
Leb128.encode(os, bytes.length);
os.write(value.getBytes());
if(bytes.length < BinaryMarker.LargeString.value - BinaryMarker.EmptyString.value) {
os.write(BinaryMarker.EmptyString.value + bytes.length);
os.write(value.getBytes());
} else {
os.write(BinaryMarker.LargeString.value);
Leb128.encode(os, bytes.length);
os.write(value.getBytes());
}
}
}

View File

@@ -47,43 +47,49 @@ public class JBONParser extends ValueParser {
String text = new String(buffer);
objectKey(text);
}
byte b;
{
int c = stream.read();
if(c == -1) {
break;
}
b = (byte) c;
int c = stream.read();
if(c == -1) {
break;
}
if(b == BinaryMarker.Null.value) {
if(c == BinaryMarker.Null.value) {
nullValue();
} else if(b == BinaryMarker.True.value) {
} else if(c == BinaryMarker.True.value) {
booleanValue(true);
} else if(b == BinaryMarker.False.value) {
} else if(c == BinaryMarker.False.value) {
booleanValue(false);
} else if(b == BinaryMarker.Int.value) {
} else if(c == BinaryMarker.Int.value) {
integerValue(decoder.decode());
} else if(b == BinaryMarker.Float.value) {
} else if(c == BinaryMarker.Float.value) {
floatValue(decoder.decodeDouble());
} else if(b == BinaryMarker.EmptyString.value) {
} else if(c == BinaryMarker.EmptyString.value) {
stringValue("");
} else if(b == BinaryMarker.LargeString.value) {
} else if(c > BinaryMarker.EmptyString.value &&
c < BinaryMarker.LargeString.value) {
byte[] buffer = new byte[c - BinaryMarker.EmptyString.value];
stream.read(buffer);
String text = new String(buffer);
stringValue(text);
} else if(c == BinaryMarker.LargeString.value) {
byte[] buffer = new byte[(int) decoder.decode()];
stream.read(buffer);
String text = new String(buffer);
stringValue(text);
} else if(b == BinaryMarker.EmptyArray.value) {
} else if(c == BinaryMarker.EmptyArray.value) {
beginArray(0);
} else if(b == BinaryMarker.LargeArray.value) {
} else if(c > BinaryMarker.EmptyArray.value && c < BinaryMarker.LargeArray.value) {
beginArray(c - BinaryMarker.EmptyArray.value);
} else if(c == BinaryMarker.LargeArray.value) {
long size = decoder.decode();
beginArray(size);
} else if(b == BinaryMarker.EmptyObject.value) {
} else if(c == BinaryMarker.EmptyObject.value) {
beginObject(0);
} else if(b == BinaryMarker.LargeObject.value) {
} else if(c > BinaryMarker.EmptyObject.value && c < BinaryMarker.LargeObject.value) {
beginObject(c - BinaryMarker.EmptyObject.value);
} else if(c == BinaryMarker.LargeObject.value) {
long size = decoder.decode();
beginObject(size);
} else {
throw new ParseException(String.format("Illegal byte at position %d: 0x%02x", cursor, b));
throw new ParseException(String.format("Illegal byte at position %d: 0x%02x", cursor, c));
}
while(stack.size() > 0) {
if ((osl = WorthUtils.dynamicCast(stack.getFirst(), ObjectStackLevel.class)) != null