十六进制字符串转换为字节Java

十六进制字符串转换为字节Java,java,arrays,hex,byte,Java,Arrays,Hex,Byte,我遇到了这个问题,因为当使用getBytes()方法时,java当然会将十六进制代码转换为ASCI,这是不正确的,我希望得到具有字节的数组,如: [01, 00, 0A, 02, 00, 00, ....., 28, 72]; 我的代码: byte array[] = { (byte) 0x1, (byte) 0x0, (byte) 0x0A, (byte) 0x02, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0,

我遇到了这个问题,因为当使用
getBytes()
方法时,java当然会将十六进制代码转换为ASCI,这是不正确的,我希望得到具有字节的数组,如:

[01, 00, 0A, 02, 00, 00, ....., 28, 72];
我的代码:

  byte array[] = { (byte) 0x1, (byte) 0x0, (byte) 0x0A, (byte) 0x02, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x72, (byte) 0x28 };

            Log.v("OUTPUT BYTE", Arrays.toString(array.getBytes()));
当前结果:

[48, 49, 48, 48, 48, 97, 48, 50, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 55, 50, 50, 56]

我需要数组中的十六进制字节。

请尝试以下代码,它可以正常工作:

byte array3[] = { (byte) 0x1, (byte) 0x0, (byte) 0x0A, (byte) 0x02, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x72, (byte) 0x28 };

        Log.v("OUTPUT BYTE", Arrays.toString(data));

请尝试以下代码,它工作正常:

byte array3[] = { (byte) 0x1, (byte) 0x0, (byte) 0x0A, (byte) 0x02, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x72, (byte) 0x28 };

        Log.v("OUTPUT BYTE", Arrays.toString(data));
%02X
将给出大写十六进制数字,
%02X
小写字母十六进制数字,均为零填充。由于字节是有符号的
(byte)0x80
实际上是-128,因此需要使用一个被字节掩盖的int:
0xFF&b

向StringBuilder添加良好的初始容量意味着在追加时更少地重新分配内存

%02X
将给出大写十六进制数字,
%02X
小写字母十六进制数字,均为零填充。由于字节是有符号的
(byte)0x80
实际上是-128,因此需要使用一个被字节掩盖的int:
0xFF&b

向StringBuilder添加良好的初始容量意味着在追加时更少地重新分配内存。

示例代码:

package com.test;

import java.util.Arrays;

public class Hexa {

    public static void main(String[] args) {
        byte array3[] = { (byte) 0x1, (byte) 0x0, (byte) 0x0A, (byte) 0x02, (byte) 0x0, (byte) 0x0, (byte) 0x0,
                (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0,
                (byte) 0x0, (byte) 0x72, (byte) 0x28 };

        String[] hexArray = new String[array3.length];
        for (int i = 0; i < array3.length; i++) {
            hexArray[i] = String.format("%02X ", array3[i]);
        }

        System.out.println(Arrays.asList(hexArray));
    }

}
示例代码:

package com.test;

import java.util.Arrays;

public class Hexa {

    public static void main(String[] args) {
        byte array3[] = { (byte) 0x1, (byte) 0x0, (byte) 0x0A, (byte) 0x02, (byte) 0x0, (byte) 0x0, (byte) 0x0,
                (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0,
                (byte) 0x0, (byte) 0x72, (byte) 0x28 };

        String[] hexArray = new String[array3.length];
        for (int i = 0; i < array3.length; i++) {
            hexArray[i] = String.format("%02X ", array3[i]);
        }

        System.out.println(Arrays.asList(hexArray));
    }

}

“我需要数组中的十六进制字节。”没有“十六进制字节”这样的东西。只有一个字节。但是,您的代码没有显示从何处获取
数据
——并且您的日志语句根本没有使用
array3
。听起来你好像错过了一大堆上下文。ESP模块接收命令是这样的:01 00 0a 02 00 00 00 00 00 72 28作为字节,但没有转换为ASCI,因为它只接收带单独字节的十六进制。你说的“它只接收带单独字节的十六进制”到底是什么意思?如果它以字节数组的形式接收,那么就没有“只接收十六进制”之类的东西——它只接收字节。由于字节数组没有
getBytes
方法,因此您当前在问题中得到的代码不会编译。我猜某个地方涉及到一个字符串,但您没有显示其中的位置。您是以字节形式还是以文本形式接收字节?这是哪个
getBytes
方法?一个字节只有8位,所以在内部它总是二进制的,但你不必担心。只要需要,您可以随时将字节再次打印为十六进制。“我需要数组中的十六进制字节。”没有“十六进制字节”这样的东西。只有一个字节。但是,您的代码没有显示从何处获取
数据
——并且您的日志语句根本没有使用
array3
。听起来你好像错过了一大堆上下文。ESP模块接收命令是这样的:01 00 0a 02 00 00 00 00 00 72 28作为字节,但没有转换为ASCI,因为它只接收带单独字节的十六进制。你说的“它只接收带单独字节的十六进制”到底是什么意思?如果它以字节数组的形式接收,那么就没有“只接收十六进制”之类的东西——它只接收字节。由于字节数组没有
getBytes
方法,因此您当前在问题中得到的代码不会编译。我猜某个地方涉及到一个字符串,但您没有显示其中的位置。您是以字节形式还是以文本形式接收字节?这是哪个
getBytes
方法?一个字节只有8位,所以在内部它总是二进制的,但你不必担心。您随时可以在需要时再次将字节打印为十六进制。现在它正在转换为ASCI代码,但应保持代码不变[01,00,0A…,27,72]。。。。72十六进制是114 ASCI,但ESP传感器当然会像前面所说的那样接收此命令。现在它正在转换为ASCI代码,但应该保持不变的代码[01,00,0A…,27,72]。。。。72十六进制是114 ASCI,但ESP传感器当然会像前面所说的那样接收此命令。十六进制的类型应该是字节而不是字符串,因为TCP write使用字节作为输入参数。@noname错误答案是正确的
array3
是输入参数,hexArray是数组的帮助变量。toString/asList.array3仍然转换为不正确的ASCI字符…:V/输入字符串:01000A0200000000000000000000000007228 V/输入字节:[1,0,10,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,114,40]java原语类型
byte
是一个从-128到127的整数,而十六进制是包含数字、字符和前导零的字符串。因此,我认为byte[]数据类型将无法存储十六进制字符串。唯一的选择是将数据作为ASCI发送,而不是将ESP转换为十六进制,并将结果返回为ASCI?由于TCP write使用byte作为输入参数,所以十六进制的类型应为byte而不是String。@noname错误答案是可以的
array3
是输入参数,hexArray是数组的帮助变量。toString/asList.array3仍然转换为不正确的ASCI字符…:V/输入字符串:01000A0200000000000000000000000007228 V/输入字节:[1,0,10,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,114,40]java原语类型
byte
是一个从-128到127的整数,而十六进制是包含数字、字符和前导零的字符串。所以我认为byte[]数据类型将无法存储十六进制字符串。唯一的选择是将数据作为ASCI发送,而不是将ESP转换为十六进制,并将结果返回为ASCI?