From e48cc1a7041ce952bf1c4653e5b0daccb39654bb Mon Sep 17 00:00:00 2001 From: Mincol Date: Wed, 29 Mar 2017 16:36:24 +0200 Subject: [PATCH 1/3] Description length cannot be negative, therefore if we use write (unsigned) instead of writeByte (signed) we can potentially use one more byte. --- .../src/main/java/btools/mapcreator/NodeData.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/brouter-map-creator/src/main/java/btools/mapcreator/NodeData.java b/brouter-map-creator/src/main/java/btools/mapcreator/NodeData.java index 515ac16..6825e47 100644 --- a/brouter-map-creator/src/main/java/btools/mapcreator/NodeData.java +++ b/brouter-map-creator/src/main/java/btools/mapcreator/NodeData.java @@ -29,7 +29,7 @@ public class NodeData extends MapCreatorBase ilon = (int)dis.readDiffed( 1 ); ilat = (int)dis.readDiffed( 2 ); int mode = dis.readByte(); - if ( ( mode & 1 ) != 0 ) { int dlen = dis.readByte(); description = new byte[dlen]; dis.readFully( description ); } + if ( ( mode & 1 ) != 0 ) { int dlen = dis.read(); description = new byte[dlen]; dis.readFully( description ); } if ( ( mode & 2 ) != 0 ) selev = dis.readShort(); } @@ -38,9 +38,9 @@ public class NodeData extends MapCreatorBase dos.writeDiffed( nid, 0 ); dos.writeDiffed( ilon, 1 ); dos.writeDiffed( ilat, 2 ); - int mode = ( description == null ? 0 : 1 ) | ( selev == Short.MIN_VALUE ? 0 : 2 ); - dos.writeByte( (byte)mode ); - if ( ( mode & 1 ) != 0 ) { dos.writeByte( description.length ); dos.write( description ); } - if ( ( mode & 2 ) != 0 ) dos.writeShort( selev ); + int mode = (description == null ? 0 : 1) | (selev == Short.MIN_VALUE ? 0 : 2); + dos.writeByte((byte) mode); + if ((mode & 1) != 0) { dos.write(description.length); dos.write(description); } + if ((mode & 2) != 0) dos.writeShort(selev); } } From 97a0f090648eba7b0629fc64fa977db8fcceee11 Mon Sep 17 00:00:00 2001 From: Mincol Date: Wed, 29 Mar 2017 16:42:08 +0200 Subject: [PATCH 2/3] Add warning if Node Description exceeds max allowed serialization length. --- .../src/main/java/btools/mapcreator/NodeData.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/brouter-map-creator/src/main/java/btools/mapcreator/NodeData.java b/brouter-map-creator/src/main/java/btools/mapcreator/NodeData.java index 6825e47..238be72 100644 --- a/brouter-map-creator/src/main/java/btools/mapcreator/NodeData.java +++ b/brouter-map-creator/src/main/java/btools/mapcreator/NodeData.java @@ -38,9 +38,15 @@ public class NodeData extends MapCreatorBase dos.writeDiffed( nid, 0 ); dos.writeDiffed( ilon, 1 ); dos.writeDiffed( ilat, 2 ); - int mode = (description == null ? 0 : 1) | (selev == Short.MIN_VALUE ? 0 : 2); - dos.writeByte((byte) mode); - if ((mode & 1) != 0) { dos.write(description.length); dos.write(description); } - if ((mode & 2) != 0) dos.writeShort(selev); + if (description != null && description.length > Byte.MAX_VALUE) { + System.err.printf("Node id (%s): description length (%d) is longer then maximum allowed (%d). The description will NOT be written.", nid, description.length, Byte.MAX_VALUE); + System.out.printf("Node id (%s): description length (%d) is longer then maximum allowed (%d). The description will NOT be written.", nid, description.length, Byte.MAX_VALUE); + dos.writeByte((byte) 0); + } else { + int mode = (description == null ? 0 : 1) | (selev == Short.MIN_VALUE ? 0 : 2); + dos.writeByte((byte) mode); + if ((mode & 1) != 0) { dos.write(description.length); dos.write(description); } + if ((mode & 2) != 0) dos.writeShort(selev); + } } } From 92701360fb58f3a920805775daf9efb30ed853ca Mon Sep 17 00:00:00 2001 From: Mincol Date: Wed, 5 Apr 2017 02:16:57 +0200 Subject: [PATCH 3/3] Changed Node description array length to short as per pull request discussion --- .../src/main/java/btools/mapcreator/NodeData.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/brouter-map-creator/src/main/java/btools/mapcreator/NodeData.java b/brouter-map-creator/src/main/java/btools/mapcreator/NodeData.java index 238be72..df1c28b 100644 --- a/brouter-map-creator/src/main/java/btools/mapcreator/NodeData.java +++ b/brouter-map-creator/src/main/java/btools/mapcreator/NodeData.java @@ -29,7 +29,7 @@ public class NodeData extends MapCreatorBase ilon = (int)dis.readDiffed( 1 ); ilat = (int)dis.readDiffed( 2 ); int mode = dis.readByte(); - if ( ( mode & 1 ) != 0 ) { int dlen = dis.read(); description = new byte[dlen]; dis.readFully( description ); } + if ( ( mode & 1 ) != 0 ) { int dlen = dis.readShort(); description = new byte[dlen]; dis.readFully( description ); } if ( ( mode & 2 ) != 0 ) selev = dis.readShort(); } @@ -43,10 +43,10 @@ public class NodeData extends MapCreatorBase System.out.printf("Node id (%s): description length (%d) is longer then maximum allowed (%d). The description will NOT be written.", nid, description.length, Byte.MAX_VALUE); dos.writeByte((byte) 0); } else { - int mode = (description == null ? 0 : 1) | (selev == Short.MIN_VALUE ? 0 : 2); - dos.writeByte((byte) mode); - if ((mode & 1) != 0) { dos.write(description.length); dos.write(description); } - if ((mode & 2) != 0) dos.writeShort(selev); + int mode = (description == null ? 0 : 1 ) | ( selev == Short.MIN_VALUE ? 0 : 2 ); + dos.writeShort( (byte) mode); + if ( ( mode & 1 ) != 0 ) { dos.write( description.length ); dos.write( description ); } + if ( ( mode & 2 ) != 0 ) dos.writeShort( selev ); } } }