1

Javaに8ビットのバイト配列があります。バイト配列は、外部センサーから受信する16ビット数の上位バイトと下位バイトで構成されます。

たとえば、バイト配列は次のようになります。

00 00 00 01 00 02 00 03
0  1  2  3  4  5  6  7

上記のバイト配列では、各偶数インデックスは16ビット数の上位バイトであり、各奇数インデックスは下位バイトです。

私が抱えている問題は、数値が127を超えて、数値の2の補数表現が優先される場合です。私が本当にやりたいのは、POSITIVEの符号なし番号を保持することです。したがって、2の補数は気にしません。これが私が成功せずにやろうとしたことです。

byte[] buffer = new byte[1024]; 

//SOME CODE SNIPPET THAT PUTS NUMBERS B/W 0-500 INTO THE BUFFER RANDOMLY

for(int i = 0; i < 1024; i+=2) {
    int twoByte = 0;
    short high = 0, low = 0;
    high = (short)buffer[i];
    low = (short)buffer[i+1];
    twoByte = ((high << 8) | low);
    System.out.println(twoByte);
}

8ビットの数字を符号なしにするためにshortに変換しようとしましたが、Javaは先行0の広告を切り捨てて8ビットとして扱い、負の符号を保持しているようです。誰かがおそらくより良い方法を知っていますか?

##編集:それが重要かどうかはわかりませんが、これはAndroidで実行されているアプリケーションであることに言及する価値があるかもしれません。##

乾杯、

4

2 に答える 2

5

試す:

int high = ((int)buffer[i]) & 0xff;
int low = ((int)buffer[i+1]) & 0xff;

int twoBytes = (high << 8) | low;

サンプルコード:

byte[] buffer = new byte[] { (byte) 0x16, (byte) 0xfa };

int high = ((int)buffer[0]) & 0xff;
int low = ((int)buffer[1]) & 0xff;
int twoBytes = (high << 8) | low;

値:

buffer   = [ 22, -6 ]
high     = 22
low      = 250
twoBytes = 5882 

5882は16進数として0x16faであり、機能します。

センサーからバイトを正しく読み取ったことを確認してください。

于 2012-11-14T08:25:07.767 に答える
2

数値を2の補数から符号なしに変換するには:

if(x<0)
{
    x=256+x;
}
于 2012-11-14T08:27:58.487 に答える