我试图从字节数组中删除写入的字符串并维护原始的单独对象:
byte[] data... // this is populated with the following:
// 00094E6966747943686174001C00074D657373616765000B4372616674656446757279000474657374
// to string using converter : " ChannelMessageUsernametest"
// notice that tab/whitespace, ignore quotes
// The byte array was compiled by writing the following (writeUTF from a writer):
// Channel
// Message
// Username
// test
现在我试图从字节数组中删除Channel
:
ByteArrayDataInput input = ByteStreams.newDataInput(message);
String channel = input.readUTF(); // Channel, don't want this
String message = input.readUTF(); // Message
// works good, but I don't want Channel,
// and I can't remove it from the data before it arrives,
// I have to work with what I have
这是我的问题:
byte[] newData = Arrays.copyOfRange(data, channel.length() + 2, data.length)
// I use Arrays.copyOfRange to strip the whitespace (I assume it's not needed)
// As well, since it's inclusive of length size, I have to add 1 more,
// resulting in channel.length() + 1
// ...
ByteArrayDataInput newInput = ByteStreams.newDataInput(message);
String channel = newInput.readUTF(); // MessageUsernametext
看看我如何失去对象的分离,我怎样才能保留原来的"部分" byte[] data
内原始byte[] newData
内的对象。
String channel
(剥离之前和之后)是一个字符串答案 0 :(得分:1)
只要您可以保证channel
始终处于合理的字符范围内(例如字母数字),将channel.length() + 2
更改为channel.length() + 4
即可。
答案 1 :(得分:0)
Java字符串有16位元素,因此将字节数组转换为字符串是安全的,尽管不是内存效率:
private byte[] removeElements(byte[] data, int fromIndex, int len) {
String str1 = new String(data).substring(0,fromIndex);
String str2 = new String(data).substring(fromIndex+len,data.length);
return (str1+str2).getBytes();
}
以同样的方式,您还可以在字节数组中搜索字符串:
private int findStringInByteArray(byte[] mainByte, String str, int fromIndex) {
String main = new String(mainByte);
return main.indexOf(str,fromIndex);
}
现在你可以一起调用这些方法:
byte[] newData = removeElements(
data,
findStringInByteArray(data,channel,0),
channel.length() );