【问题标题】:Converting a set of strings to a byte[] array将一组字符串转换为 byte[] 数组
【发布时间】:2010-01-13 14:41:25
【问题描述】:

我正在尝试将一组字符串转换为 byte[] 数组。起初,我做这样的事情来将字节数组转换为字符串:

public String convertByte(byte[] msg) {
    String str = "";        
    for(int i = 0; i < msg.length; i++) {
        str += (msg[i] + " * ");
    }       
    return str;
}

当我尝试转换回 byte[] 数组时,我得到的值与转换为字符串时的值不同。我最初有一些东西给了我不正确的值。

我目前正在尝试以下方式:

public static byte[] convertStr(String ln)
{
    System.out.println(ln);

    String[] st = ln.split(" * ");
    byte[] byteArray = new byte[23];
    for(int i = 0; i < st.length; i++)
    {
        byteArray[i] = st[i].get byte value or something;
    }

    return byteArray;
}

如果我尝试使用 String api 中的 getbytes() 方法,它会返回一个字节数组而不是一个字节,这是我的问题。

任何帮助将不胜感激。

【问题讨论】:

  • getBytes() 有什么问题?你得到一个字节数组,但这就是你想要的,或者不是?您不能将字符串转换为单个字节,因为一个字节小于大多数字符串...

标签: java string bytearray byte


【解决方案1】:

使用 Byte.parseByte 可能有助于您的第二个 sn-p 工作。

但是,除非您有特定的理由使用这种表示,否则我会使用其他答案中提到的 Java 方法将字符串编码为字节数组。

public static byte[] convertStr(String ln)
{
    System.out.println(ln);

    String[] st = ln.split(" * ");
    byte[] byteArray = new byte[23];
    for(int i = 0; i < st.length; i++)
    {
        byteArray[i] = Byte.parseByte(st[i]);
    }

    return byteArray;
}

【讨论】:

    【解决方案2】:

    这应该可行:

    byte[] bytes = "Hello World".getBytes("UTF-8");
    String hello = new String(bytes, "UTF-8");
    

    以上示例使用 UTF-8 编码,仅作为示例。在消息输入中使用您期望的字符编码。 (这个“答案”不是问题的答案......)

    编辑

    所以我们需要从 byte[] 到 String 再到 byte[] 的转换。 me123 在值之间(和前面)添加了分隔符。正如其他人已经解释的那样, 1. 拆分的正则表达式必须是 " \\* " 和 2.神奇的方法是Byte.parseByte(st[i])

    这是一个不使用分隔符但固定字节条目宽度的替代方法。 StringToByte 转换器显示了一个非常快速的解决方案,它仅基于字符串 char 数组。

    public static String convertByte(byte[] msg) {
        StringBuilder sb = new StringBuilder();
        for (byte b:msg) {
            sb.append(String.format("%02x", b));
        }
        return sb.toString();
    }
    
    public static byte[] convertStr(String ln)
    {
        System.out.println(ln);
        char[] chars = ln.toCharArray();
        byte[] result = new byte[ln.length()/2];
        for (int i = 0;i < result.length; i++) {
            result[i] = (byte) hexToInt(chars[2*i], chars[2*i+1]);
        }
    
        return result;
    }
    
    private static int hexToInt(char c1, char c2) { 
        return ((c1 <= '9' ? c1 - '0':c1 - 'a'+10) << 4) 
               + (c2 <= '9' ? c2 - '0':c2 - 'a'+10);
    }
    

    【讨论】:

    • 他想将一组Strings转换成字节数组,而不是单个String。
    • 不,这不起作用,因为他使用自己的函数将字节数组转换为字符串,例如{0, 1, 2, 3} -> "0 * 1 * 2 * 3 * "
    • 愚蠢的我,是的,你是对的 - 完全不同的问题的正确答案;)谢谢提示。
    【解决方案3】:

    我不明白您为什么要按字符获取这些字节。 getBytes() 及其变体将立即为您提供整个字符串的 byte[] 数组。 但是,如果您想查看字符的编码方式,您的方法可能很好,但您必须记住,一个字符可以编码为例如在某些编码中为一到四个字节,因此每个字符都需要一个字节数组。

    【讨论】:

      【解决方案4】:

      如果您确定字符串足够小以容纳一个字节,您可以这样做

      st[i].getBytes()[0];
      

      但是,在大多数情况下,您的字符串可能会更大,因此在这些情况下,这是不可能的......

      【讨论】:

        【解决方案5】:

        如果你确定字符串包含 1 个字节,你可以这样做:

        byteArray[i] = st[i].getbytes()[0];
        

        【讨论】:

          【解决方案6】:

          hexToInt 应该是这样的

          private static int hexToInt(char c1, char c2) {
              return (Character.digit(c1, 16) << 4) + Character.digit(c2, 16);
          }
          

          否则 CA 以字节为单位返回 AA。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-08-05
            • 1970-01-01
            • 2017-08-21
            • 2019-12-30
            • 2017-11-27
            • 2021-05-14
            相关资源
            最近更新 更多