求助:Java中十六进制字符串转字节数组,getBytes()不符合预期
解决十六进制字符串转字节数组的问题
我来帮你理清这个问题——你遇到的核心误区是误用了getBytes()方法,它的作用和你想要的完全不一样。
问题根源
String.getBytes()的作用是把字符串按指定字符编码转换为字节数组,比如字符串里的"01"会被转成ASCII码的0x30(字符'0')和0x31(字符'1'),这显然不是你要的十六进制值对应的字节。你需要的是把十六进制字符串的每两个字符解析成一个实际的数值字节。
另外你代码里的array.getBytes()是错误的——byte[]类型本身并没有getBytes()方法,这应该是你之前对十六进制字符串调用的错误操作。你手动创建的byte array[]其实已经是符合预期的目标数组了,不需要再做额外转换。
正确的实现方法
下面是一个不依赖第三方库的工具方法,专门用来把十六进制字符串(带空格或不带都可以)转换成你需要的字节数组:
import java.util.Arrays; public class HexConverter { public static byte[] hexStringToByteArray(String hexString) { // 先移除字符串中的所有空格(适配带空格的输入格式) String cleanedHex = hexString.replaceAll("\\s+", ""); // 十六进制字符串长度必须是偶数,否则无法每两个字符对应一个字节 if (cleanedHex.length() % 2 != 0) { throw new IllegalArgumentException("十六进制字符串长度必须为偶数"); } byte[] result = new byte[cleanedHex.length() / 2]; for (int i = 0; i < cleanedHex.length(); i += 2) { // 截取每两个字符,解析为十六进制整数后转成byte String hexPair = cleanedHex.substring(i, i + 2); result[i / 2] = (byte) Integer.parseInt(hexPair, 16); } return result; } public static void main(String[] args) { // 你的目标十六进制格式字符串 String targetHex = "01 00 0A 02 00 00 00 00 00 00 00 00 00 00 00 00 72 28"; byte[] byteArray = hexStringToByteArray(targetHex); // 输出结果:Arrays.toString会以十进制显示字节,和十六进制是对应关系 // 比如0x0A对应十进制10,0x72对应114,0x28对应40 System.out.println(Arrays.toString(byteArray)); // 输出:[1, 0, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, 40] } }
额外简化方案(依赖第三方库)
如果你可以引入Apache Commons Codec库,还能直接用现成方法简化操作:
import org.apache.commons.codec.binary.Hex; // 先清理空格再转换 byte[] byteArray = Hex.decodeHex(targetHex.replaceAll("\\s+", "").toCharArray());
内容的提问来源于stack exchange,提问作者noname
相关产品推荐
相关产品推荐

