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

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

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

转换为:

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

我能做什么?

【问题讨论】:

  • byte n[] = str.getBytes() 将完成任务。但是,new 会出错,因为它是关键字,不能用作标识符。
  • @backslashN: 结果会不会像{97, 97} 和{53, 53}?

标签: java hex byte


【解决方案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】:

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

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

  1. 检查字符串是否仅包含 2 个字符
  2. 这些字符在 '0'..'9' 或 'a'..'f' 区间内(考虑它们的大小写) 以及)
  3. 将每个字符转换为相应的数字,减去“0”或“a”的代码值
  4. 建立一个字节值,其中第一个字符是高位,第二个字符是低位。例如

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

【讨论】:

    【解决方案3】:

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

    byte[] theByteArray = stringToConvert.getBytes();
    

    将字符串转换为字节:

     String str = "aa";
    
     byte b = Byte.valueOf(str);
    

    【讨论】:

    • 当输入一个从 A 到 F 的值时,它会给我 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;
        

        【讨论】:

          猜你喜欢
          • 2017-08-23
          • 1970-01-01
          • 2019-07-27
          • 2015-01-20
          • 2014-03-10
          • 1970-01-01
          • 2012-02-11
          • 1970-01-01
          • 2021-08-29
          相关资源
          最近更新 更多