JAVA JDBC 驱动程序 PostgreSQL:解析编码为 BYTEA 对象的数字
JAVA JDBC Driver PostgreSQL: Parse numbers encoded as BYTEA object
我有关系,其中每条记录都有按以下顺序编码 3 个数字的 BYTEA 列 (UTF-8):
字节 0-1:数字 1
字节 2-3:数字 2
字节 4-6:数字 3
如何将二进制数据解析为可读的数字?
目前我有这个但不知道如何继续:
Class.forName(dbDriver);
Connection connection = DriverManager.getConnection(dbUrl, dbUser, dbPass);
Statement st = connection.createStatement();
String query = "SELECT ...";
ResultSet rs = st.executeQuery(query);
while (rs.next()) {
byte[] data = rs.getBytes(1);
//TODO Parse
}
谢谢,
你能试试这个吗:
对于字符串:
String tatto = "my tatto"; //for example
byte[] array = tatto.getBytes(); // Or any bytes
String s = new String(array);
System.out.println(s);
对于字节[]:
byte[] data = new byte[]{ 1, 16, 84, 2, 101, 110, 83, 111};
long val = 0;
for (int i = 0; i < data.length; i++)
{
val = (val << 8) + (data[i] & 0xff);
}
System.out.println(val);
这取决于数字的存储方式。
它们是二进制的吗?
他们是signed吗?
他们是大还是小endian?
假设前两个是肯定的,您可以使用位操作,例如
// Little-endian
short num1 = (short) ((data[0] & 0xFF) | (data[1] & 0xFF) << 8);
// Big-endian
short num1 = (short) ((data[0] & 0xFF) << 8 | (data[1] & 0xFF));
但它可能更容易使用 ByteBuffer
:
ByteBuffer buf = ByteBuffer.wrap(data).order(ByteOrder.LITTLE_ENDIAN);
short num1 = buf.getShort();
short num2 = buf.getShort();
short num3 = buf.getShort();
ByteBuffer
默认为BIG_ENDIAN
。
我有关系,其中每条记录都有按以下顺序编码 3 个数字的 BYTEA 列 (UTF-8):
字节 0-1:数字 1
字节 2-3:数字 2
字节 4-6:数字 3
如何将二进制数据解析为可读的数字?
目前我有这个但不知道如何继续:
Class.forName(dbDriver);
Connection connection = DriverManager.getConnection(dbUrl, dbUser, dbPass);
Statement st = connection.createStatement();
String query = "SELECT ...";
ResultSet rs = st.executeQuery(query);
while (rs.next()) {
byte[] data = rs.getBytes(1);
//TODO Parse
}
谢谢,
你能试试这个吗:
对于字符串:
String tatto = "my tatto"; //for example
byte[] array = tatto.getBytes(); // Or any bytes
String s = new String(array);
System.out.println(s);
对于字节[]:
byte[] data = new byte[]{ 1, 16, 84, 2, 101, 110, 83, 111};
long val = 0;
for (int i = 0; i < data.length; i++)
{
val = (val << 8) + (data[i] & 0xff);
}
System.out.println(val);
这取决于数字的存储方式。
它们是二进制的吗?
他们是signed吗?
他们是大还是小endian?
假设前两个是肯定的,您可以使用位操作,例如
// Little-endian
short num1 = (short) ((data[0] & 0xFF) | (data[1] & 0xFF) << 8);
// Big-endian
short num1 = (short) ((data[0] & 0xFF) << 8 | (data[1] & 0xFF));
但它可能更容易使用 ByteBuffer
:
ByteBuffer buf = ByteBuffer.wrap(data).order(ByteOrder.LITTLE_ENDIAN);
short num1 = buf.getShort();
short num2 = buf.getShort();
short num3 = buf.getShort();
ByteBuffer
默认为BIG_ENDIAN
。