diff --git a/api/src/main/java/com/seibel/distanthorizons/coreapi/util/StringUtil.java b/api/src/main/java/com/seibel/distanthorizons/coreapi/util/StringUtil.java index edb554245..bf077b49d 100644 --- a/api/src/main/java/com/seibel/distanthorizons/coreapi/util/StringUtil.java +++ b/api/src/main/java/com/seibel/distanthorizons/coreapi/util/StringUtil.java @@ -63,4 +63,21 @@ public class StringUtil } + private static final char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray(); + /** + * Converts the given byte array into a hex string representation.
+ * source: https://stackoverflow.com/a/9855338 + */ + public static String byteArrayToHexString(byte[] bytes) + { + char[] hexChars = new char[bytes.length * 2]; + for (int i = 0; i < bytes.length; i++) + { + int v = bytes[i] & 0xFF; + hexChars[i * 2] = HEX_ARRAY[v >>> 4]; + hexChars[i * 2 + 1] = HEX_ARRAY[v & 0x0F]; + } + return new String(hexChars); + } + } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/sql/AbstractMetaDataRepo.java b/core/src/main/java/com/seibel/distanthorizons/core/sql/AbstractMetaDataRepo.java index d19e8b194..a1713b750 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/sql/AbstractMetaDataRepo.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/sql/AbstractMetaDataRepo.java @@ -20,8 +20,8 @@ package com.seibel.distanthorizons.core.sql; import com.seibel.distanthorizons.core.pos.DhSectionPos; +import com.seibel.distanthorizons.coreapi.util.StringUtil; -import java.sql.ResultSet; import java.sql.SQLException; import java.util.Map; @@ -44,16 +44,7 @@ public abstract class AbstractMetaDataRepo extends AbstractDhRepo String posString = (String) objectMap.get("DhSectionPos"); DhSectionPos pos = DhSectionPos.deserialize(posString); - String dataString = (String) objectMap.get("Data"); - int byteLength = dataString.length() - dataString.replace(",", "").length(); - byte[] dataByteArray = new byte[byteLength]; - - String[] byteStrings = dataString.split(","); - for (int i = 0; i < byteLength; i++) - { - dataByteArray[i] = Byte.parseByte(byteStrings[i]); - } - + byte[] dataByteArray = (byte[]) objectMap.get("Data"); MetaDataDto metaFile = new MetaDataDto(pos, dataByteArray); return metaFile; @@ -66,14 +57,7 @@ public abstract class AbstractMetaDataRepo extends AbstractDhRepo public String createInsertSql(MetaDataDto dto) { String pos = dto.pos.serialize(); - - StringBuilder dataStringBuilder = new StringBuilder(); - for (byte b : dto.dataArray) - { - dataStringBuilder.append(b).append(','); - } - String dataString = (dataStringBuilder.length() != 0) ? ("'"+dataStringBuilder.toString()+"'") : "NULL"; - + String dataString = createDataHexString(dto); return "INSERT INTO "+this.getTableName()+" (DhSectionPos, Data) " + "VALUES('"+pos+"',"+dataString+");"; @@ -83,14 +67,7 @@ public abstract class AbstractMetaDataRepo extends AbstractDhRepo public String createUpdateSql(MetaDataDto dto) { String pos = dto.pos.serialize(); - - StringBuilder dataStringBuilder = new StringBuilder(); - for (byte b : dto.dataArray) - { - dataStringBuilder.append(b).append(','); - } - String dataString = (dataStringBuilder.length() != 0) ? ("'"+dataStringBuilder.toString()+"'") : "NULL"; - + String dataString = createDataHexString(dto); return "UPDATE "+this.getTableName()+" " + "SET Data = "+dataString + @@ -98,4 +75,7 @@ public abstract class AbstractMetaDataRepo extends AbstractDhRepo } + /** This creates a string that Sqlite interprets as binary data. */ + private static String createDataHexString(MetaDataDto dto) { return "X'" + StringUtil.byteArrayToHexString(dto.dataArray) + "'"; } + }