Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将十六进制字符串强制转换为类对象_Java_Arrays_Serialization_Deserialization_Hexdump - Fatal编程技术网

Java 将十六进制字符串强制转换为类对象

Java 将十六进制字符串强制转换为类对象,java,arrays,serialization,deserialization,hexdump,Java,Arrays,Serialization,Deserialization,Hexdump,我有一门课是这样的: public class Fields implements java.io.Serializable{ public short ID; public int SSN; public long Number; } //ID has short type so we need 2 bytes ID=4096; //(decimal value of 1000) //SSN has integer type so we need 4 bytes S

我有一门课是这样的:

public class Fields implements java.io.Serializable{
    public short ID;
    public int SSN;
    public long Number;
}
//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)
我有一个十六进制字符串,值如下,每两个字符代表一个字节:

String str="1000180018000540AC80D6487653E5000100D40B7900D4C3FFF2FAFF8985";
现在,我想将此字符串强制转换为模式中的上述类对象,如下所示:

public class Fields implements java.io.Serializable{
    public short ID;
    public int SSN;
    public long Number;
}
//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)

此铸造可以在C++中实现,代码<>代码>很容易,但问题是,我可以用java实现序列化。我认为,当我们首先将一个类对象序列化为字节数组时,可以使用序列化,然后我们可以将获得的字节反序列化为基本类对象,这与我的建议有一点不同,因为我有一个字符串(类似字节),我想反序列化它。那么我该怎么做呢?

您只需要
拆分
解析

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序列化有一种非常特定的数据格式,它不能帮助您解析使用不同预定义格式获得的数据。但在解析此类数据时可能会很有用

首先,您需要将字符串转换为实际的
字节[]
数组。我将使用一个简单的解决方案,请随意选择另一个更适合您的示例的解决方案:

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
,因此如果您需要的话,您可以不使用该调用。

我认为
不起作用。
“1000”
的内部字节表示为4个ASCII字节。一个用于字符
1
0x31
),后跟3个字符
0
0x30
),而不是
0x10、0x00
十六进制。使用
id
中得到的结果将是十六进制
0x31303030
而不是
0x1000

您需要做的是解析字符串的不同组件

这样做应该可以:

int id = Integer.parseInt(str.substring(0,4), 16);

序列化对你没有帮助。它有非常特殊的格式,与你的格式不匹配。你必须手动解析字符串。@ Talx,但C++容易使用<代码> <代码>。所以在java中没有像
那样的方法?因为速度对我来说很重要,使用高速字符串数据手动解析将是一个瓶颈!不,
是不容易做到的。它甚至不起作用。“1000”是4个ASCII字节,0x31,0x30,0x30,0x30,C++将不会神奇地转换成2个字节0x10,0x00。@ AHMADIMORTEZAALALI,如果你想使用<代码> <代码>你必须使用<代码> C++ >代码>:java没有任何类似的东西。这是NIO <代码> ByteBuffer < /C> >的很好用法。非常感谢!通过改变buffer.order(ByteOrder.LITTLE_ENDIAN)to
buffer.order(ByteOrder.BIG_ENDIAN)我想要的结果完全达到了@ahmadimortezaali:请注意,BIG_ENDIAN是默认值,因此在这种情况下,您也可以完全忽略它。您的意思可能是
int id=…
?是的,本打算分两行完成,但我改变了主意,忘了更改类型。