2016-03-19 12 views
3

JavaクライアントからC++サーバーのソケット接続を介して数値データを受信して​​います。私が4バイトのint型のデータを受け取ったとき、必要なのはntohl()関数を使うか、ビット順を逆にしてC++ int型に変換するだけです。しかし、私は長いデータ型をJavaから変換しようとするのに問題があります。私が何を試しても、正しい値を回復できませんでした。私はLONG​​64、ULONG64、int64_tも使っていて、どれも働いていませんでした。私はC++でJava longをint64に変換する

size = ntohl(size) 

をすれば

int64_t size; 
recv(client, (char *)&size, sizeof int64_t, 0); 

は、次にサイズが0どんなオリジナルのlong値になります:私は、Javaから長いS = 1を送信するときに、C++側で私がやっ例えば

、 Javaにあります!

私は、S = 1

、次いでntohl()変換、サイズ= 72057594037927936をしない場合、私はほとんどこのトピックに関する有用な情報を発見したと私はどんな提案をいただければ幸いです。

+0

わかりやすくするために、* 64ビット*を占有する4バイトのint型データはどのアーキテクチャにありますか?最後に私はチェックしました、** 4 **バイトはほぼ常に4オクテット= ** 32 **ビットです。あなたはいつも(a)それらを 'int8_t ar [n]'に読み込み、実際にバイト数を確認して、シーケンス内のどこにあるかを確認して検証できます。 'recv'の返却結果を確認することもできませんでした。 – WhozCraig

+0

Javaは、CやC++とは異なり、エンディアンを気にしません。それはいつもビッグエンディアンになります。それはあなたの問題の原因ではありませんか? – fge

+0

ありがとうございます。回答でRobが述べたように、問題はntohl()関数自体にあり、32ビットデータで動作します。 –

答えて

2

値72057594037927936は、16進数で0x0100000000000000です。あなたが推測しているかもしれませんが、それは単純に後方のバイトオーダーです.1はバックではなく前面にあります。

ntohl()は32ビットなので、上位4バイト(最初の8桁の16進数)がゼロになります。代わりにhtonllを使うこともできますが、そうではありません。最も良いことは、バイトの順序を自分自身と逆にすることです。

int64_t size; 
recv(client, (char *)&size, sizeof int64_t, 0); 
char *start = (char *)&size, *end = start + sizeof(size); 
std::reverse(start, end); 

バイトを逆転させる方法のトン、および一般にはほとんど/ビッグエンディアンの問題に対処するための方法のトンがあります。

+0

明確でわかりやすい。ありがとうございます! –

関連する問題