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) + "'"; }
+
}