2

私が開発しているアプリでは、まず、10 進数値から 16 進数文字列への変換を行います。

たとえば、int 値-100000を 16 進数値に変換します。

hex_value = Integer.toHexString (-100000)

そして、私はこれを取得します:

hex_value = FFFE7960

次に、逆変換を行う必要があります。FFFE7960の 16 進数値を取得し、再度-100000に変換する必要があります。これには次を使用します。

int_value = Integer.parseInt(hex_value,16)

しかし、 -100000 を取得する代わりに、4294867296を取得します

そのため、signed int 値を取得する代わりに、アプリでエラーを引き起こす unsigned 値を取得しています。

目的の値を取得するにはどうすればよいですか?

更新 - 完全なコード

これは、Bluetooth 経由で受信する文字列です。

s = "2b 00 ff fe 79 60"

StringTokenizer を使用して、次のように分割します。

StringTokenizer tokens = new StringTokenizer(s," ");
String one = tokens.nextToken();
String two = tokens.nextToken();
String three = tokens.nextToken();
String four = tokens.nextToken();
String five = tokens.nextToken();
String six = tokens.nextToken();

received_hexValue = three + four + five + six;

したがって、received_hexValue = "fffe7960"

ここで、必要な変換を行います。

int_value_receive = (int)Long.parseLong(received_hexValue, 16);
int_value_receive = -200000 - int_value_receive;
newIntValue = (int_value_receive * 100) / (200000 * (-1));

最初の行で、16 進数から int に変換するときに、デバッガーが Long.invalidLong(String) エラーをスローし、logcat に次のコメント付きのエラーが表示されます: java.lang.NullPointerException

4

1 に答える 1

2

次のコードを使用してみてください。

String hex_value = Integer.toHexString(-100000);
Log.d("Home", "Hex : " + hex_value);

int int_value = (int) Long.parseLong(hex_value, 16);
Log.d("Home", "Int : " + int_value);

このコードは最初に長い値4294867296を作成し、次に出力として返します-100000

編集

あなたのコードは次のようなものです

String s = "2b 00 ff fe 79 60";
StringTokenizer tokens = new StringTokenizer(s, " ");
String one = tokens.nextToken();
String two = tokens.nextToken();
String three = tokens.nextToken();
String four = tokens.nextToken();
String five = tokens.nextToken();
String six = tokens.nextToken();

String received_hexValue = three + four + five + six;

Log.d("Home", "Hex : " + received_hexValue);

//to get sub string of your length, pass start and end offset
Log.d("Home", "SubString Hex : " +received_hexValue.substring(0, 8));

int int_value_receive = (int) Long.parseLong(received_hexValue, 16);
Log.d("Home", "Old Int : " + int_value_receive);
int_value_receive = -200000 - int_value_receive;
Log.d("Home", "Int : " + int_value_receive);
int newIntValue = (int_value_receive * 100) / (200000 * (-1));
Log.d("Home", "New Int : " + newIntValue);

出力

09-03 16:22:37.421: DEBUG/Home(28973): Hex: fffe7960
09-03 16:22:37.421: DEBUG/Home(28973): 古い Int: -100000
09-03 16:22:37.421: DEBUG /Home(28973): Int: -100000
09-03 16:22:37.421: DEBUG/Home(28973): New Int: 50

于 2013-09-03T10:11:20.823 に答える