如何将一个或多个字符串转换为 Java 字节数组中的不同范围?

How can I convert a string or multiple strings into different ranges within a byte array in Java?

我有一组字符串,用于字段,如姓名、用户 ID、电子邮件等,需要放入特定大小(1024 字节)的 byte[] 数组中。

我很想找到一个 method/function 可以让我像下面这样简单地使用我的索引变量 bufferPosition:

byteArray[bufferPosition] += name += userID += email;

bufferPosition += name.length() += userID.length() += email.length();

到目前为止,我发现的都是将字符串直接转换为字节数组的方法,以及一些看似繁琐的解决这个问题的方法(即将字符串的每个元素视为一个字符,转换为字节,创建一个循环构造并插入每个元素)。

编辑:跟进

我还有一些字段是 String[] 数组,最多包含 14 个元素。这将是最乏味的部分。我可以使用类似的 for-each 循环吗?我认为有一种非常聪明的方法可以解决这个问题。

试试这个,使用 System.arraycopy:

// some dummy data
byte[] myByteArr = new byte[1024];
String name = "name";
String userId = "userId";
int bufferPosition = 0;

// repeat this for all of your fields...
byte[] stringBytes = name.getBytes();  // get bytes from string
System.arraycopy(stringBytes, 0, myByteArr, bufferPosition, stringBytes.length);  // copy src to dest
bufferPosition += stringBytes.length;  // advance index

您可以使用循环来完成此操作(使用您的字段名称):

String[] myFields = new String[]{name, userID, email};  // put your fields in an array or list

// loop through each field and copy the data
for (String field : myFields) {
    byte[] stringBytes = field.getBytes();  // get bytes from string
    System.arraycopy(stringBytes, 0, myByteArr, bufferPosition, stringBytes.length);  // copy src to dest
    bufferPosition += stringBytes.length;  // advance index
}

您需要确保不超出数组的边界,但这是一个简单的示例。

稍微改进的版本(thx @Ryan J):

private static byte[] bytesFromStrings(final String... data) throws UnsupportedEncodingException {
    final byte[] result = new byte[1024];
    int bufferPosition = 0;
    if (data != null) {
        for (String d : data) {
            final byte[] stringBytes = d.getBytes("UTF-8");
            if (bufferPosition > 1023) {
                break;
            } else {
                System.arraycopy(stringBytes, 0, result, bufferPosition, Integer.min(1024 - bufferPosition, stringBytes.length));
                bufferPosition = Integer.min(bufferPosition + stringBytes.length, 1024);
            }   
        }
    }
    return result;
}

..with null/overflow 处理和动态数据:-)

编辑:...以及一些可移植性注意事项。 (d.getBytes())