クラスオブジェクトに進文字列をキャスト

モルテザアリはアーマディ:

私はこのようなクラスを持っています:

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

そして私は、各2つの文字がバイトの代表である。このような値は16進文字列を有しています。

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>、そう簡単にはなくてC ++でに似たJavaでそこにキャストされる質問は、私はJavaでシリアライズしていることを実現することができ、言われています。私のような(私たちは最初のバイト配列にクラスのオブジェクトをシリアル化および第二私たちは私の提案少し異なるプリミティブクラスオブジェクト、取得したバイトをデシリアライズすることができたとき、私は、文字列を持っているので、シリアライズは、使用することができると思いますバイト)私は、シリアル化を解除したいです。だから私はそれをどのように行うことができますか?

ヨアヒム・ザウアー:

Javaのシリアライズは非常に特定のデータ・フォーマットを持っており、それはあなたが別の事前定義されたフォーマットで取得したデータを解析助けにはなりません。しかし、この種のデータを解析するのに有用であることができます。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、それはあなたが必要なものだ場合は、単にその呼び出しを省略することができるように。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=222985&siteId=1