2016-06-29 7 views
-2

混乱しています - 私たちはオクテットストリームバイナリファイルを処理しようとしています。さまざまな可能な宛先構造体があります。入ってくるファイルは、最初にバイト配列に変換する必要があることが分かっているxバイトの文字列(blob)です。 FORループを使用して、一度にバイトをバイト配列に移動します。次に、データ内の固定位置のテキストフィールドで定義されているように、データの特定の構造体を認識すると、その構造体に固有の逆直列化ルーチンが使用されます。文字配列は、文字列変数を格納するために1つのdeserialize関数を使用し、受け取ったデータを介して整数フィールドに他の変数(通常はUINT16)などを設定します。下位整数のバイト8が負に設定されている場合、int16(2バイト整数)処理が失敗することがわかります。ブロブは、FORループを使用してバイト配列に移動された後までFORループの8ビット整数、文字、または何であるのかどうかもわかりません(特定のビットが設定されていると整数変換が失敗します

標準
for (i=1, I <= blob_length, i++) 
{dest(i) = source(i); } 

)、我々は持っていますどの構造体が有効であるかを特定する。私たちはデシリアライズを出る頃には

は、我々は次のようにデータが破損している参照してください。

ので、小数点以下511人のバイナリ01 11111111改宗は256バイナリ01 00000000

が、10進数10進383 01進01111111が正しく

変換します

上位ビットがオンの場合、またはUINT16の実際のデシリアライズ処理が失敗した場合、FORループ処理が何らかの形で8ビットフィールドを処理できないかどうかはわかりません。私たちは、8番目のビットが処理を壊す他のASCII関連の問題を解決するために苦労しました。これがまだ別のものか、それが他のものかどうかはわかりません。

洞察力や指導に感謝します。

+6

関連するコードセグメントを掲載することはできますか? –

+0

表示している小さなコードセグメントはコンパイルされず、byte []から他のタイプへの変換も表示されません。だから、伝えるのは本当に難しいです。実際に関連している**実際の**コードを表示してコンパイルしてください! –

+1

'dest'と' source'タイプは何ですか?配列の場合は、 '(i)'の代わりに '[i]'を使うべきです。そして、あなたのコードは、 'source'を' dest'にコピーするだけでなく、多くの仕事をするようには思えません。 –

答えて

0

通常インデックスは0ベースであり、forループは次のようになります。

for(int i = 0; i < blob_length; i++) { 
    dest[i] = source[i]; 
} 

は、おそらくあなたは、1バイトのオフでした。

+0

あなたは正しいです - 私は間違ったコードを転送しました。私たちは0から始めました.1から始めると、すべてのバイトが間違っていました。実際、上位ビットのバイトだけが間違っています。 –

+0

あなたのコードには、変換の問題に関連するものは表示されません。それはあなたが何かをどのようにコピーしているかを示しているだけです。 –

+0

私はあなたの質問を理解しています。私はコード作成者ではありません - 私はこれをコーディングしている人たちから "フェンスの反対側"に取り組み、その特定のビットパターンがなぜ失敗するのか判断できません。 WebコードがBLOBを受け取ると、文字列配列からバイト配列へのFORループのコピーが行われます。私は彼らがなぜこのことを思い出すことができないのか理解していませんが、もしそうであればコンパイルされません。 –

関連する問題