Jetez un chaîne hexadécimale à un objet de classe

Morteza ali ahmadi:

J'ai une classe comme ceci:

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

et j'ai une chaîne hexadécimale avec la valeur de ce type dont chacun 2 caractères est représentatif d'un octet:

String str="1000180018000540AC80D6487653E5000100D40B7900D4C3FFF2FAFF8985";

Maintenant, je veux lancer cette chaîne à l'objet de classe ci-dessus dans un schéma comme celui-ci:

//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)

Cette coulée peut être mis en œuvre en C ++ avec <reinterpret_cast>si facilement , mais comme est - il coulé en Java similaire à C ++ en question est dit, je peux mettre en œuvre qu'avec sérialisation en Java. Je pense que la sérialisation peut être utilisé lorsque nous sérialiser un objet de classe aux tableaux d'octets en première et deuxième nous pouvons désérialiser les octets obtenus à l'objet de classe primitive, qui est différent de mon proposer un peu, parce que j'ai une chaîne (comme octets) que je veux désérialiser que. Alors , comment puis - je faire?

Joachim Sauer:

Sérialisation Java a un format de données très spécifique et il ne vous aide pas à analyser les données que vous obtenez avec un format prédéfini différent. Mais unByteBuffer peut être utile dans l' analyse de ce genre de données.

D' abord , vous devez transformer votre chaîne en un véritable byte[]tableau. Je vais utiliser une solution simple de cette réponse , vous pouvez choisir un autre qui est plus approprié à votre exemple:

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();

Que ce soit ou non besoin de l' order()appel dépend de ce que boutisme vos données est. ByteBufferPar défaut BIG_ENDIAN, donc vous pouvez laisser cet appel si c'est ce que vous avez besoin.

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=222986&siteId=1
conseillé
Classement