Привести шестнадцатеричную строку к объекту класса - PullRequest
0 голосов
/ 31 января 2019

У меня есть такой класс:

public class Fields implements java.io.Serializable{
    public short ID;
    public int SSN;
    public long Number;
}

, и у меня есть шестнадцатеричная строка с таким значением, каждые 2 символа которого представляют байт:

String str="1000180018000540AC80D6487653E5000100D40B7900D4C3FFF2FAFF8985";

ТеперьЯ хочу привести эту строку к вышеуказанному объекту класса в схеме, подобной этой:

//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 ++ с помощью <reinterpret_cast> так легко, но как Есть ли приведение в Javaкак в C ++ вопрос, я могу реализовать это с сериализацией в Java.Я думаю, что сериализация может использоваться, когда мы сначала сериализуем объект класса в байтовые массивы, а во-вторых, мы можем десериализовать полученные байты в объект примитивного класса, что немного отличается от моего предложения, потому что у меня есть строка (например,байт), который я хочу десериализовать это.Так как я могу это сделать?

Ответы [ 3 ]

0 голосов
/ 31 января 2019

Сериализация Java имеет очень специфический формат данных и не помогает вам анализировать данные, которые вы получаете, с другим предопределенным форматом.Но a ByteBuffer может быть полезным при разборе данных такого типа.

Сначала вам нужно преобразовать вашу строку в фактический массив byte[].Я использую простое решение из этого ответа , не стесняйтесь выбирать другое, более подходящее для вашего примера:

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, так что вы можете просто оставить этот вызов, если это то, что вам нужно.

0 голосов
/ 31 января 2019

Я не думаю, что <reinterpret_cast> сработало бы.Внутреннее байтовое представление "1000" составляет 4 байта ASCII.Один для символа 1 (0x31), за которым следуют 3 символа 0 (0x30), а не 0x10, 0x00 шестнадцатеричный.Результат, который вы получите в id с <reinterpret_cast>, будет шестнадцатеричным 0x31303030, а не 0x1000.

Что вам нужно сделать, это проанализировать различные компоненты строки.

Примерно так должно поступить:

int id = Integer.parseInt(str.substring(0,4), 16);
0 голосов
/ 31 января 2019

Вам просто нужно 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);
}
...