当前位置: 首页 > 知识库问答 >
问题:

在Android中尝试将int值转换为字节值的问题

郑曜灿
2023-03-14

我一直在尝试实现一个单选对话框,您可以在其中选择TxPower选项之一,并根据您选择的选项(-23dBm)-

下面是单选对话框的代码:

fields.writeBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                UUID uuid = mCharacteristic.getUuid();
                if (uuid.equals(BleDefinedUUIDs.Characteristic.TxPower)){
                    final CharSequence[] choice = {"-23dBm","-6dBm","0dBm","4dBm"};
                    new AlertDialog.Builder(v.getContext())
                    .setSingleChoiceItems(choice, 0, null)
                    .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            dialog.dismiss();
                            int selectedPosition = ((AlertDialog)dialog).getListView().getCheckedItemPosition();
                            if (selectedPosition == 0) {
                                String hex = Integer.toHexString(selectedPosition).toLowerCase(Locale.getDefault());
                                byte[] dataToWrite = parseHexStringToBytes(hex);

                                mBleWrapper.writeDataToCharacteristic(mCharacteristic, dataToWrite);
                            }
                            if (selectedPosition == 1) {
                                String hex = Integer.toHexString(selectedPosition).toLowerCase(Locale.getDefault());
                                byte[] dataToWrite = parseHexStringToBytes(hex);

                                mBleWrapper.writeDataToCharacteristic(mCharacteristic, dataToWrite);
                            }
                            if (selectedPosition == 2) {
                                String hex = Integer.toHexString(selectedPosition).toLowerCase(Locale.getDefault());
                                byte[] dataToWrite = parseHexStringToBytes(hex);

                                mBleWrapper.writeDataToCharacteristic(mCharacteristic, dataToWrite);
                            }
                            if (selectedPosition == 3) {
                                String hex = Integer.toHexString(selectedPosition).toLowerCase(Locale.getDefault());
                                byte[] dataToWrite = parseHexStringToBytes(hex);

                                mBleWrapper.writeDataToCharacteristic(mCharacteristic, dataToWrite);
                            }
                        }
                    })
                    .show();

                }
            }

        });  

下面是函数parseHextStringToBytes,它转换返回最终字节值:

public byte[] parseHexStringToBytes(final String hex) {
    String tmp = hex.substring(2).replaceAll("[^[0-9][a-f]]", "");
    byte[] bytes = new byte[tmp.length() / 2]; // every two letters in the string are one byte finally

    String part = "";

    for(int i = 0; i < bytes.length; ++i) {
        part = "0x" + tmp.substring(i*2, i*2+2);
        bytes[i] = Long.decode(part).byteValue();
    }

    return bytes;
}

最后,这是错误本身的日志:

07-25 16:38:56.467: E/AndroidRuntime(7326): FATAL EXCEPTION: main
07-25 16:38:56.467: E/AndroidRuntime(7326): Process: org.bluetooth.bledemo, PID: 7326
07-25 16:38:56.467: E/AndroidRuntime(7326): java.lang.StringIndexOutOfBoundsException: length=1; index=2
07-25 16:38:56.467: E/AndroidRuntime(7326):     at java.lang.String.indexAndLength(String.java:584)
07-25 16:38:56.467: E/AndroidRuntime(7326):     at java.lang.String.substring(String.java:1449)
07-25 16:38:56.467: E/AndroidRuntime(7326):     at org.bluetooth.bledemo.CharacteristicDetailsAdapter.parseHexStringToBytes(CharacteristicDetailsAdapter.java:102)
07-25 16:38:56.467: E/AndroidRuntime(7326):     at org.bluetooth.bledemo.CharacteristicDetailsAdapter$2$1.onClick(CharacteristicDetailsAdapter.java:171)
07-25 16:38:56.467: E/AndroidRuntime(7326):     at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:167)
07-25 16:38:56.467: E/AndroidRuntime(7326):     at android.os.Handler.dispatchMessage(Handler.java:102)
07-25 16:38:56.467: E/AndroidRuntime(7326):     at android.os.Looper.loop(Looper.java:136)
07-25 16:38:56.467: E/AndroidRuntime(7326):     at android.app.ActivityThread.main(ActivityThread.java:5579)
07-25 16:38:56.467: E/AndroidRuntime(7326):     at java.lang.reflect.Method.invokeNative(Native Method)
07-25 16:38:56.467: E/AndroidRuntime(7326):     at java.lang.reflect.Method.invoke(Method.java:515)
07-25 16:38:56.467: E/AndroidRuntime(7326):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
07-25 16:38:56.467: E/AndroidRuntime(7326):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
07-25 16:38:56.467: E/AndroidRuntime(7326):     at dalvik.system.NativeStart.main(Native Method)

注意:当selectposition==1时,第171行对应于调用ParseHextStringToBytes,第102行是函数ParseHextStringToBytes中的字符串tmp。

如果您需要任何进一步的信息,请让我知道,但我真的需要有人帮助我解决这个问题

共有1个答案

堵鸿光
2023-03-14

您的字节[]似乎太小,因此无法处理您试图输入的内容。我建议你仔细检查一下允许的尺寸。

此外,你检查过这个答案吗?

你可以试着用

byte[] bytes = hexStringToByteArray(yourString);

其中,链接中所述的功能定义为:

public static byte[] hexStringToByteArray(String s) {
    int len = s.length();
    byte[] data = new byte[len / 2];
    for (int i = 0; i < len; i += 2) {
        data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                         + Character.digit(s.charAt(i+1), 16));
    }
    return data;
}

告诉我它是否有帮助=)

 类似资料:
  • 我知道,如果我们对字节值执行算术运算,那么隐式地将其提升为int值,结果将是int值,因此我们需要显式地将其转换为byte,以便将结果存储在byte变量中。但我想问- 从字节到int的转换是在声明它的时候发生的,还是在我们在算术运算中使用它的时候发生的?因为我使用的java反编译器在声明时将它从字节转换为int。所以,这是反编译器的问题还是真的是这样。 如果它真的发生在声明时,那么为什么存储超出字

  • 问题内容: 实际上,我需要将值与过孔一起转移。.现在我的问题是我需要将a。转移为 单个 值.. tat是否可以 转换 为 单个 值..并在那里检索它…我尝试了 铸造 的事情,但它不是有用。如果我的做法是正确的只是帮助我这个,或者说一些其他的方式。 (每次使用铸造时,返回的都是65535) 问题答案: 那这个呢? 和

  • 如何将字符串值转换为int?我正在获取。 结果应该类似于。

  • 问题内容: 在Java中将a转换boolean为an 的最常用方法是什么int? 问题答案: ^^ PS : true = 1 and false = 0

  • 问题内容: s是“ E”,但我想要的是“ 123” 请告诉我如何获得“ 123”。 在Java中,我可以这样进行: 如何在Go中输入两个字符串? 问题答案: 使用包的功能。 例如: 您可以简单地通过添加字符串或使用包的功能来连接字符串。

  • 我想将字符串转换为int。 例如: 如果是,则应将其转换为与相同的 为什么我需要这个。因为我要将unicode int转换为表情符号,所以我使用的是这段代码。 你能让我知道我该怎么做吗?