将十六进制字符串转换为 class 对象
Cast a hexadecimal string to a class object
我有一个 class 这样的:
public class Fields implements java.io.Serializable{
public short ID;
public int SSN;
public long Number;
}
我有一个十六进制字符串,其值如下,每 2 个字符代表一个字节:
String str="1000180018000540AC80D6487653E5000100D40B7900D4C3FFF2FAFF8985";
现在我想将此字符串转换为上面的 class 对象,如下所示:
//ID has short type so we need 2 bytes
ID=4096; //(decimal value of 1000)
//SSN has integer type so we need 4 bytes
SSN=402659328; //(decimal value of 18001800)
//Number has long type so we need 8 bytes
Number=378492038049986131; //(decimal value of 0540AC80D6487653)
这个转换可以很容易地用 <reinterpret_cast>
在 c++ 中实现,但是正如 Is there cast in Java similar to in C++ 问题所说,我可以在 java 中用序列化实现它。我认为序列化可以在我们首先将一个 class 对象序列化为字节数组时使用,其次我们可以将获得的字节反序列化为原始 class 对象,这与我的建议略有不同,因为我有一个字符串(如字节),我想反序列化它。那我该怎么做呢?
你只需要 split
和 parse
public Fields(String str) {
ID = Short.parseShort(str.substring(0, 4), 16);
SSN = Integer.parseInt(str.substring(4, 12), 16);
Number = Long.parseLong(str.substring(12, 28), 16);
}
Java 序列化具有非常特定的数据格式,它无法帮助您解析使用不同的预定义格式获得的数据。但是 a ByteBuffer
在解析这种数据时很有用。
首先,您需要将字符串转换为实际的 byte[]
数组。我将使用 this answer 中的一个简单解决方案,您可以随意选择另一个更适合您的示例的解决方案:
byte[] data = DatatypeConverter.parseHexBinary(str);
ByteBuffer buffer = ByteBuffer.wrap(data);
buffer.order(ByteOrder.LITTLE_ENDIAN); // maybe!
short id = buffer.getShort();
int ssn = buffer.getInt();
long number = buffer.getLong();
是否需要 order()
调用取决于数据的字节顺序。ByteBuffer
默认为 BIG_ENDIAN
,因此如果是这样,您可以保留该调用你需要。
我认为 <reinterpret_cast>
行不通。 "1000"
的内部字节表示是 4 个 ASCII 字节。一个用于字符 1
(0x31
) 后跟 3 个字符 0
(0x30
) ,而不是 0x10, 0x00
十六进制。使用 <reinterpret_cast>
在 id
中得到的结果将是十六进制 0x31303030
而不是 0x1000
.
您需要做的是解析字符串的不同组成部分。
应该这样做:
int id = Integer.parseInt(str.substring(0,4), 16);
我有一个 class 这样的:
public class Fields implements java.io.Serializable{
public short ID;
public int SSN;
public long Number;
}
我有一个十六进制字符串,其值如下,每 2 个字符代表一个字节:
String str="1000180018000540AC80D6487653E5000100D40B7900D4C3FFF2FAFF8985";
现在我想将此字符串转换为上面的 class 对象,如下所示:
//ID has short type so we need 2 bytes
ID=4096; //(decimal value of 1000)
//SSN has integer type so we need 4 bytes
SSN=402659328; //(decimal value of 18001800)
//Number has long type so we need 8 bytes
Number=378492038049986131; //(decimal value of 0540AC80D6487653)
这个转换可以很容易地用 <reinterpret_cast>
在 c++ 中实现,但是正如 Is there cast in Java similar to in C++ 问题所说,我可以在 java 中用序列化实现它。我认为序列化可以在我们首先将一个 class 对象序列化为字节数组时使用,其次我们可以将获得的字节反序列化为原始 class 对象,这与我的建议略有不同,因为我有一个字符串(如字节),我想反序列化它。那我该怎么做呢?
你只需要 split
和 parse
public Fields(String str) {
ID = Short.parseShort(str.substring(0, 4), 16);
SSN = Integer.parseInt(str.substring(4, 12), 16);
Number = Long.parseLong(str.substring(12, 28), 16);
}
Java 序列化具有非常特定的数据格式,它无法帮助您解析使用不同的预定义格式获得的数据。但是 a ByteBuffer
在解析这种数据时很有用。
首先,您需要将字符串转换为实际的 byte[]
数组。我将使用 this answer 中的一个简单解决方案,您可以随意选择另一个更适合您的示例的解决方案:
byte[] data = DatatypeConverter.parseHexBinary(str);
ByteBuffer buffer = ByteBuffer.wrap(data);
buffer.order(ByteOrder.LITTLE_ENDIAN); // maybe!
short id = buffer.getShort();
int ssn = buffer.getInt();
long number = buffer.getLong();
是否需要 order()
调用取决于数据的字节顺序。ByteBuffer
默认为 BIG_ENDIAN
,因此如果是这样,您可以保留该调用你需要。
我认为 <reinterpret_cast>
行不通。 "1000"
的内部字节表示是 4 个 ASCII 字节。一个用于字符 1
(0x31
) 后跟 3 个字符 0
(0x30
) ,而不是 0x10, 0x00
十六进制。使用 <reinterpret_cast>
在 id
中得到的结果将是十六进制 0x31303030
而不是 0x1000
.
您需要做的是解析字符串的不同组成部分。
应该这样做:
int id = Integer.parseInt(str.substring(0,4), 16);