Javaでの値を決定するために必要な3バイトの符号付き数値があります。私はそれが1の補数で署名されていると信じていますが、100%確信はありません(私はこのことを10年以上研究しておらず、私の問題の文書化はあまり明確ではありません)。私が抱えている問題は、Javaが2の補数ですべてを実行することだと思います。示す具体的な例があります。
元の3バイトの数値:
0xEE1B17
整数(
Integer.parseInt(s, 16)
)として解析すると、次のようになります:15604503これを簡単にビットフリップ(
~
)すると、2の補数表現が得られます(と思います):-15604504しかし、私が取得する必要がある値は次のとおりです。-1172713
私が起こっていると思うのは、intの3バイトだけでなく、int全体の2の補数を取得しているということですが、これを修正する方法がわかりません。
私ができることは、整数を2進文字列(Integer.toBinaryString()
)に変換してから、すべての0を1に、またはその逆に手動で「反転」することです。次に、この整数(Integer.parseInt(s, 16)
)を解析すると、非常に近い1172712が得られます。他のすべての例では、答えを得るために常に結果に1を追加する必要があります。
ここで使用されている符号付き数値エンコーディングのタイプを診断できますか?また、文字列のすべての文字を手動で反転する以外の解決策があるかどうかを診断できますか?これを行うにはもっとエレガントな方法があるに違いないと思います。
編集:すべてのレスポンダーはさまざまな方法で助けてくれましたが、私の一般的な質問は3バイトの数字を反転する方法で、@ louis-wassermanがこれに答えて最初に答えたので、彼を解決策としてマークします。助けてくれたみんなに感謝します!