如何将一个或多个字符串转换为 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()
)
我有一组字符串,用于字段,如姓名、用户 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()
)