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), EmptyArray(0xaf),
LargeArray(0xff); LargeArray(0xff);
public byte value; public int value;
BinaryMarker(int b) { BinaryMarker(int b) {
value = (byte) b; value = b;
} }
} }

View File

@@ -94,6 +94,8 @@ public class JBONDumper extends ValueDumper {
protected void beginObject(int size) { protected void beginObject(int size) {
if(size == 0) { if(size == 0) {
os.write(BinaryMarker.EmptyObject.value); os.write(BinaryMarker.EmptyObject.value);
} else if(size < BinaryMarker.LargeObject.value - BinaryMarker.EmptyObject.value) {
os.write(BinaryMarker.EmptyObject.value + size);
} else { } else {
os.write(BinaryMarker.LargeObject.value); os.write(BinaryMarker.LargeObject.value);
Leb128.encode(os, size); Leb128.encode(os, size);
@@ -110,6 +112,8 @@ public class JBONDumper extends ValueDumper {
protected void beginArray(int size) { protected void beginArray(int size) {
if(size == 0) { if(size == 0) {
os.write(BinaryMarker.EmptyArray.value); os.write(BinaryMarker.EmptyArray.value);
} else if(size < BinaryMarker.LargeArray.value - BinaryMarker.EmptyArray.value) {
os.write(BinaryMarker.EmptyArray.value + size);
} else { } else {
os.write(BinaryMarker.LargeArray.value); os.write(BinaryMarker.LargeArray.value);
Leb128.encode(os, size); Leb128.encode(os, size);
@@ -135,10 +139,15 @@ public class JBONDumper extends ValueDumper {
if(value.isEmpty()) { if(value.isEmpty()) {
os.write(BinaryMarker.EmptyString.value); os.write(BinaryMarker.EmptyString.value);
} else { } else {
os.write(BinaryMarker.LargeString.value);
byte[] bytes = value.getBytes(); byte[] bytes = value.getBytes();
Leb128.encode(os, bytes.length); if(bytes.length < BinaryMarker.LargeString.value - BinaryMarker.EmptyString.value) {
os.write(value.getBytes()); 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); String text = new String(buffer);
objectKey(text); objectKey(text);
} }
byte b; int c = stream.read();
{ if(c == -1) {
int c = stream.read(); break;
if(c == -1) {
break;
}
b = (byte) c;
} }
if(b == BinaryMarker.Null.value) { if(c == BinaryMarker.Null.value) {
nullValue(); nullValue();
} else if(b == BinaryMarker.True.value) { } else if(c == BinaryMarker.True.value) {
booleanValue(true); booleanValue(true);
} else if(b == BinaryMarker.False.value) { } else if(c == BinaryMarker.False.value) {
booleanValue(false); booleanValue(false);
} else if(b == BinaryMarker.Int.value) { } else if(c == BinaryMarker.Int.value) {
integerValue(decoder.decode()); integerValue(decoder.decode());
} else if(b == BinaryMarker.Float.value) { } else if(c == BinaryMarker.Float.value) {
floatValue(decoder.decodeDouble()); floatValue(decoder.decodeDouble());
} else if(b == BinaryMarker.EmptyString.value) { } else if(c == BinaryMarker.EmptyString.value) {
stringValue(""); 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()]; byte[] buffer = new byte[(int) decoder.decode()];
stream.read(buffer); stream.read(buffer);
String text = new String(buffer); String text = new String(buffer);
stringValue(text); stringValue(text);
} else if(b == BinaryMarker.EmptyArray.value) { } else if(c == BinaryMarker.EmptyArray.value) {
beginArray(0); 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(); long size = decoder.decode();
beginArray(size); beginArray(size);
} else if(b == BinaryMarker.EmptyObject.value) { } else if(c == BinaryMarker.EmptyObject.value) {
beginObject(0); 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(); long size = decoder.decode();
beginObject(size); beginObject(size);
} else { } 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) { while(stack.size() > 0) {
if ((osl = WorthUtils.dynamicCast(stack.getFirst(), ObjectStackLevel.class)) != null if ((osl = WorthUtils.dynamicCast(stack.getFirst(), ObjectStackLevel.class)) != null