【问题标题】:How to convert a String array to a Byte array? (java)如何将 String 数组转换为 Byte 数组? (爪哇)
【发布时间】:2013-01-18 03:41:30
【问题描述】:

我有一个要转换为一维字节数组的一维字符串数组。我该怎么做呢?这需要 ByteBuffer 吗?我怎样才能做到这一点? (字符串可以是任意长度,只是想知道如何进行这样的操作。在将其转换为字节数组后,如何将其转换回字符串数组?

-丹

【问题讨论】:

  • 您可以对每个字符串进行迭代并继续追加到最终字节数组。String example = "This is an example"; //使用 .getBytes() 函数将 String 转换为 byte[] byte[] bytes = example.getBytes(); //使用 new String(byte[]) String s = new String(bytes); 将 byte[] 转换为 String
  • 你见过这个问题吗? stackoverflow.com/questions/1536054/…
  • Ali B - 我认为你链接的问题回答了一个稍微不同的问题 - 特别是当你看到接受的答案时,它正确地指出“如果你真的想以 String 类型存储二进制数据,你应该使用 Base64 编码。
  • 字符串没有唯一的字节表示。你想用什么字符编码?

标签: java bytearray converter bytebuffer arrays


【解决方案1】:

数组到数组你应该手动转换成两边,但是如果你只有一个字符串你可以String.getBytes()new String(byte[] data); 像这样

public static void main(String[] args) {
    String[] strings = new String[]{"first", "second"};
    System.out.println(Arrays.toString(strings));
    byte[][] byteStrings = convertToBytes(strings);
    strings = convertToStrings(byteStrings);
    System.out.println(Arrays.toString(strings));

}

private static String[] convertToStrings(byte[][] byteStrings) {
    String[] data = new String[byteStrings.length];
    for (int i = 0; i < byteStrings.length; i++) {
        data[i] = new String(byteStrings[i], Charset.defaultCharset());

    }
    return data;
}


private static byte[][] convertToBytes(String[] strings) {
    byte[][] data = new byte[strings.length][];
    for (int i = 0; i < strings.length; i++) {
        String string = strings[i];
        data[i] = string.getBytes(Charset.defaultCharset()); // you can chose charset
    }
    return data;
}

对于 string[] 中的一个字节[],您必须:

  • 到 byteArray 使用一些分隔符从每个字符串连接字节数组
  • 从 bytearray 按相同的分隔符拆分并创建 String 为 I 如上所述。

【讨论】:

    【解决方案2】:

    您没有说要对字节做什么(除了之后将它们转换回String[]),而是假设您可以将它们视为不透明的数据包(因此您可以将它们保存到一个文件或通过网络或其他方式发送它们,但你不需要以任何方式检查或修改它们),我认为你最好的选择是使用序列化。要序列化您的字符串数组,您可以编写如下内容:

    final String[] stringArray = { "foo", "bar", "baz" };
    
    final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    final ObjectOutputStream objectOutputStream =
        new ObjectOutputStream(byteArrayOutputStream);
    objectOutputStream.writeObject(stringArray);
    objectOutputStream.flush();
    objectOutputStream.close();
    
    final byte[] byteArray = byteArrayOutputStream.toByteArray();
    

    然后要恢复它,你可以写相反的:

    final ByteArrayInputStream byteArrayInputStream =
        new ByteArrayInputStream(byteArray);
    final ObjectInputStream objectInputStream =
        new ObjectInputStream(byteArrayInputStream);
    
    final String[] stringArray2 = (String[]) objectInputStream.readObject();
    
    objectInputStream.close();
    

    【讨论】:

    • 我喜欢这个,因为它分隔了字符串数组,所以如果您正在写入文件并稍后读取它,您可以分隔对象而不必担心字符串分隔符。但我的问题是 ObjectInputStream 和 ObjectOutputStream 的行为是否会在不同版本的 Java 中保持不变,或者使用旧 JRE 保存的文件会在某些时候变得不稳定?
    【解决方案3】:

    你可以检查一下

    package javaapplication2;
    
    import java.util.Arrays;
    
    
    /**
     *
     * @author Ali
     */
    public class JavaApplication2 {
    
    
     public static byte[] to_byte(String[] strs) {
            byte[] bytes=new byte[strs.length];
            for (int i=0; i<strs.length; i++) {
                bytes[i]=Byte.parseByte(strs[i]);
            }
            return bytes;
        }
    
    
        public static void main(String[] args) {
            String[] input = {"1","2","3"};       //original data
            byte[] byteArray = to_byte(input);//data to byte array
            String[] recovered=Arrays.toString( byteArray).split(",");// recovered data 
    
        }    
    }
    

    【讨论】:

      【解决方案4】:

      首先像我在这里声明str="Suresh"一样声明字符串
      第二使用getBytes()将其转换为字节
      getBytes em> 返回字节数组。

      String str="Suresh";
      byte[] s=str.getBytes();
      

      【讨论】:

        【解决方案5】:

        String.getBytes()?就是你要找的。​​p>

        【讨论】:

        • 我必须对每个字符串都这样做吗?但这不只是将单个字符串转换为字节数组吗?我有一堆字符串,我想将它们组合成一个字节数组......我想我可以使用它,只是想看看是否有办法不这样做。谢谢
        • 您可以先将它们连接成一个大字符串,然后在它们上获取字节? @丹尼尔H
        • @DanielH - 没有办法直接从String[]byte[] - 你必须遍历你的String[] 并转换每一个,然后将它放入你的@987654325 @
        • 谢谢。我从这些回复中收集的所有信息中得到了这一切。再次感谢
        • Err,String 没有那个方法。至少在我的 Java 中没有。
        【解决方案6】:

        我会将其视为序列化问题,并按如下方式实现(完整且有效的 Java 代码):

        import java.nio.ByteBuffer;
        import java.util.ArrayList;
        
        public class Serialization {
            public static byte[] serialize(String[] strs) {
                ArrayList<Byte> byteList = new ArrayList<Byte>();
                for (String str: strs) {
                    int len = str.getBytes().length;
                    ByteBuffer bb = ByteBuffer.allocate(4);
                    bb.putInt(len);
                    byte[] lenArray = bb.array();
                    for (byte b: lenArray) {
                        byteList.add(b);
                    }
                    byte[] strArray = str.getBytes();
                    for (byte b: strArray) {
                        byteList.add(b);
                    }
                }
                byte[] result = new byte[byteList.size()];
                for (int i=0; i<byteList.size(); i++) {
                    result[i] = byteList.get(i);
                }
                return result;
            }
        
            public static String[] unserialize(byte[] bytes) {
                ArrayList<String> strList = new ArrayList<String>();
                for (int i=0; i< bytes.length;) {
                    byte[] lenArray = new byte[4];
                    for (int j=i; j<i+4; j++) {
                        lenArray[j-i] = bytes[j];
                    }
                    ByteBuffer wrapped = ByteBuffer.wrap(lenArray);
                    int len = wrapped.getInt();
                    byte[] strArray = new byte[len];
                    for (int k=i+4; k<i+4+len; k++) {
                        strArray[k-i-4] = bytes[k];
                    }
                    strList.add(new String(strArray));
                    i += 4+len;
                }
                return strList.toArray(new String[strList.size()]);
            }
        
            public static void main(String[] args) {
                String[] input = {"This is","a serialization problem;","string concatenation will do as well","in some cases."};
                byte[] byteArray = serialize(input);
                String[] output = unserialize(byteArray);
                for (String str: output) {
                    System.out.println(str);
                }
            }
        }
        

        我们的想法是,在结果字节数组中,我们存储第一个字符串的长度(如果我们使用int 类型,则始终为 4 个字节),然后是第一个字符串的字节(其长度可以读取后面的 4 个字节),然后是第二个字符串的长度和第二个字符串的字节,依此类推。这样,字符串数组可以很容易地从生成的字节数组中恢复,如上面的代码所示。而且这种序列化方式可以应对任何情况。

        如果我们对输入字符串数组做一个假设,代码会简单得多:

        public class Concatenation {
            public static byte[] concatenate(String[] strs) {
                StringBuilder sb = new StringBuilder();
                for (int i=0; i<strs.length; i++) {
                    sb.append(strs[i]);
                    if (i != strs.length-1) {
                        sb.append("*.*"); //concatenate by this splitter
                    }
                }
                return sb.toString().getBytes();
            }
        
            public static String[] split(byte[] bytes) {
                String entire = new String(bytes);
                return entire.split("\\*\\.\\*");
            }
        
            public static void main(String[] args) {
                String[] input = {"This is","a serialization problem;","string concatenation will do as well","in some cases."};
                byte[] byteArray = concatenate(input);
                String[] output = split(byteArray);
                for (String str: output) {
                    System.out.println(str);
                }
            }
        }
        

        假设*.* 不存在于输入数组的任何字符串中。换句话说,如果您事先知道某些特殊的符号序列不会出现在输入数组的任何字符串中,您可以使用该序列作为拆分器。

        【讨论】:

          【解决方案7】:

          您可以对每个字符串进行迭代并继续追加到最终的字节数组。

          String example = "This is an example";
          //Convert String to byte[] using .getBytes() function
          byte[] bytes = example.getBytes();
          //Convert byte[] to String using new String(byte[])      
          String s = new String(bytes);
          

          【讨论】:

            猜你喜欢
            • 2012-05-18
            • 1970-01-01
            • 2020-02-27
            • 2016-10-01
            • 2010-12-02
            • 1970-01-01
            • 1970-01-01
            • 2021-08-19
            • 1970-01-01
            相关资源
            最近更新 更多