2011-06-09 20 views
2

私はJavaアプリケーションを使用して、byte []構造体をDBに保持しています(Hibernateを使用)。私は後でこれらの構造体を読み込むC++アプリケーションを作成しています。C++のJava byte []へのアクセス

私は問題があります.... DBに書き込まれたbyte []構造体は、元のバイト数 - 27バイトよりも長く見えます。

実際のデータの先頭を正しく見つけるために、byte []ヘッダ構造を(C++で)判別する方法はありますか?

JNIソースコード(GetArrayLength(jbytearray)など)を調べて、どのように動作するのかを確認しましたが、JVMコードのバラエティに素早く没頭しました。うん...

アイデア?

+3

あなたは 'byte []'の実際のサイズも構造体も考えません。配列のより良い説明、それが持つ可能性のある規則性、前と後のサンプルを提供すると助けになります。 –

+0

DB構造が一般的な意味でクロスプラットフォームである必要がある場合は、データの永続化/直列化の方法を変更する側から攻撃することを検討することもできます。 – Darien

+0

データの長さは、永続化されるデータのタイプによって異なります。いくつかのものは短いもの(Javaで書かれた65バイトと実際のデータでは38バイト)と長さが長いもの(DBでは1789バイト、実データでは1762バイト)です。結局、全長は関係ありませんよね? – redBeard

答えて

4

オブジェクトはおそらくJava Object Serialization Protocolを使用してシリアル化されています。最初に魔法の番号0xACEDを探して確認できます。これが当てはまる場合、クラスと長さに関するいくつかのメタ情報でラップされているだけで、実際のバイト値を簡単に解析できます。特に

は、4バイト長続い0x75 ...bytes... 0x70をあろうclassDesc要素続くヘッダ、次いでバイト自身のため0xAC 0xED 0x00 0x05を見ることになります。 Javaは、長さおよび他のマルチバイト値をビッグエンディアン形式でシリアル化します。

+0

ありがとう、ありがとう、ありがとう。それはまさに私が見ているものです。私はそれのようなものを探して見つけませんでした。 – redBeard

関連する問題