java字符串转换为十六进制数组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java字符串转换为十六进制数组相关的知识,希望对你有一定的参考价值。

可不可以把比如字符串 "55010100AAFF69" 转成十六进制 0x55, 0x01, 0x01, 0x00, 0x00, 0xAA, 0xFF, 0x69,后放入Byte数组...

十六进制格式存储好说,主要还是要看你这种是怎么拆分,比如5 50 10 10 0A AF F6 9或5 5 0 1 0 1 0 0 A A F F 6 9或…… 参考技术A
  private Byte[] test(String s) 
    int len = s== null ? 0 : s.length() / 2;
    Byte[] bs = new Byte[len];
    for ( int i = 0; i < len; i ++ ) 
      String hex = s.substring(i*2, i*2+2);
      int num = Integer.parseInt(hex, 16);
      bs[i] = new Byte((byte)num);
    
    return bs;
  

如果需要的是byte数组,那么直接将int强制转为byte就行了。如果直接用Byte的parse,需要处理异常。

追问

你这得到的数组里面是十进制的啊。。我想得到0x55, 0x01, 0x01, 0x00, 0x00, 0xAA, 0xFF形式的byte数组啊

追答

byte数组里面都是byte数值啊,你说的0x55什么的,只是byte数据的显示模式而已,在编译器里面如果查看变量值的话,选择“Show Hex Value”的选项查看就行

参考技术B 字符串作为函数change的参数inputStr
byte[] change(String inputStr)
byte[] result = new byte[inputStr.length() / 2];
for (int i = 0; i < inputStr.length() / 2; ++i)
result[i] = (byte)(Integer.parseInt(inputStr.substring(i * 2, i * 2 +2), 16) & 0xff);
return result;
追问

你这得到的数组里面是十进制的啊。。我想得到0x55, 0x01, 0x01, 0x00, 0x00, 0xAA, 0xFF形式的byte数组啊

追答

所谓的进制只有在显示出来给人看时才有意义,不管是0x55还是85存入byte中对电脑来说都是一样的,只有输出的时候才能看出差别。
比如你写:
byte a = 85;
System.out.println(”0x" + Integer.toString(a, 16));
那么输出的结果就是0x55。
反过来你写:
byte a = 0x55;
System.out.println(a);
那么输出的结果还是85。

本回答被提问者采纳
参考技术C import java.util.Scanner;
String source="55010100AAFF69);

sc=new Scanner(source);
byte [] Byte = new byte[10];
int i=0;

while (sc.hasNextByte(16)) Byte[i++]=sc.NextByte(16);

如何在 Java 中将十六进制字符串转换为字节值

【中文标题】如何在 Java 中将十六进制字符串转换为字节值【英文标题】:How to convert hex strings to byte values in Java 【发布时间】:2012-01-28 23:35:08 【问题描述】:

我有一个字符串数组。 我想将其转换为字节数组。 我使用Java程序。 例如:

String str[] = "aa", "55";

转换为:

byte new[] = (byte)0xaa, (byte)0x55;

我能做什么?

【问题讨论】:

见***.com/questions/140131/… byte n[] = str.getBytes() 将完成任务。但是,new 会出错,因为它是关键字,不能用作标识符。 @backslashN: 结果会不会像97, 9753, 53 【参考方案1】:
String str = "Your string";

byte[] array = str.getBytes();

【讨论】:

总是指定一个特定的字符集,比如UTF-8,除非默认的平台相关字符集是足够的(在大多数情况下这是不可取的)使用该方法的重载版本之一,比如String#getBytes(Charset charset)String#getBytes(String charsetName). byte[] array = str.getBytes("UTF-8");抛出 UnsupportedEncodingException【参考方案2】:

看示例我猜你的意思是字符串数组实际上是字节的十六进制表示的数组,不是吗?

如果是,那么对于每个字符串项,我将执行以下操作:

    检查字符串是否仅包含 2 个字符 这些字符在 '0'..'9' 或 'a'..'f' 区间内(考虑它们的大小写) 以及) 将每个字符转换为相应的数字,减去“0”或“a”的代码值

    建立一个字节值,其中第一个字符是高位,第二个字符是低位。例如

    int byteVal = (firstCharNumber << 4) | secondCharNumber;
    

【讨论】:

【参考方案3】:

将字符串转换为字节数组:

byte[] theByteArray = stringToConvert.getBytes();

将字符串转换为字节:

 String str = "aa";

 byte b = Byte.valueOf(str);

【讨论】:

当输入一个从 AF 的值时,它会给我 NumberFormatException【参考方案4】:

您可以尝试类似的方法:

String s = "65";

byte value = Byte.valueOf(s);

对String数组中的所有元素使用Byte.ValueOf()方法将它们转换为Byte值。

【讨论】:

它不起作用。 java.lang.NumberFormatException:无法将“aa”解析为整数 这意味着它是一个空字符串【参考方案5】:

还有很长的路要走:)。我不知道摆脱长 for 语句的方法

ArrayList<Byte> bList = new ArrayList<Byte>();
for(String ss : str) 
    byte[] bArr = ss.getBytes();
    for(Byte b : bArr) 
        bList.add(b);
    

//if you still need an array
byte[] bArr = new byte[bList.size()];
for(int i=0; i<bList.size(); i++) 
    bArr[i] = bList.get(i);

【讨论】:

【参考方案6】:

由于没有十六进制字符串到单字节转换的答案,这里是我的:

private static byte hexStringToByte(String data) 
    return (byte) ((Character.digit(data.charAt(0), 16) << 4)
                  | Character.digit(data.charAt(1), 16));

示例用法:

hexStringToByte("aa"); // 170
hexStringToByte("ff"); // 255
hexStringToByte("10"); // 16

或者你也可以试试Integer.parseInt(String number, int radix)imo,比别人好很多。

// first parameter is a number represented in string
// second is the radix or the base number system to be use
Integer.parseInt("de", 16); // 222
Integer.parseInt("ad", 16); // 173
Integer.parseInt("c9", 16); // 201

【讨论】:

这对我来说是最好的方法【参考方案7】:
String source = "testString";
byte[] byteArray = source.getBytes(encoding); 

您可以对数组中的所有字符串执行相同的操作。

【讨论】:

我的意思是将 (String)"aa" 更改为 (byte)0xaa,而不是更改为 (byte)0x97, (byte)0x97【参考方案8】:

最简单的方式(使用Apache Common Codec):

byte[] bytes = Hex.decodeHex(str.toCharArray());

【讨论】:

【参考方案9】:
String str[] = "aa", "55";

byte b[] = new byte[str.length];

for (int i = 0; i < str.length; i++) 
    b[i] = (byte) Integer.parseInt(str[i], 16);

Integer.parseInt(string, radix) 将字符串转换为整数,radix参数指定数字系统。 如果字符串表示十六进制数,则使用 16 为基数。 如果字符串表示二进制数,则使用基数 2。 如果字符串表示十进制数,则使用 10 的基数(或省略基数参数)。

有关更多详细信息,请查看 Java 文档:https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#parseInt(java.lang.String,%20int)

【讨论】:

仅代码答案无法解释代码为何起作用:请为未来的访问者添加说明您为解决问题所做的工作。【参考方案10】:

这里,如果你将字符串转换为字节[]。有一个实用代码:

    String[] str = result.replaceAll("\\[", "").replaceAll("\\]","").split(", ");
    byte[] dataCopy = new byte[str.length] ;
    int i=0;
    for(String s:str ) 
        dataCopy[i]=Byte.valueOf(s);
        i++;
    
    return dataCopy;

【讨论】:

以上是关于java字符串转换为十六进制数组的主要内容,如果未能解决你的问题,请参考以下文章

在 Java 中,如何将字节数组转换为十六进制数字字符串,同时保持前导零? [复制]

在 Java 中,如何将字节数组转换为十六进制数字字符串,同时保持前导零? [复制]

Java将字节数组转换为十六进制字节数组[重复]

二进制转换为string字符串?

java中,如何将double类型数据转换为16进制字符串或者是16进制字节数组

如何将十六进制字符串转换为 Java 字符串?