我有一个奇怪的问题。基本上我使用的队列服务器仅以byte []形式输入,因此我使用两个int和int []并使用ByteArrayOutputStream
转换它们。它迄今为止工作得很好,但因为我从队列中传递了很多消息,所以我试图压缩我的int [](它有几千个项目,但大多数都是零)。我有想到采取零序列并将它们变成负值(请参阅question的回答。如何识别具有从byte []转换的负值的int?
但是,我遇到了问题,因为要将我的字节[]恢复为原来的格式byte []的长度并将它除以4(因为每个int的大小是4,然后遍历它)。由于我已将负值引入列表中,大小已更改(每个负1),这是我已经尝试了不同的方式来获取数据到Byte [],而ByteArrayOutputStream似乎是迄今为止我尝试过的最快的方式,除非有更快的速度,否则我更愿意坚持使用这种方法。在我的链接问题中,接受的答案有一个方法,似乎完全适合现有的循环结构,我已经在使用隐式数据(取代所有ze ro的零序列的负数)。
任何想法如何区分正负字节流?
下面的代码:
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
public class compressionTest {
public static void main(String[] args) throws IOException {
//to convert to string
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
//data
int data1 = 10;
int data2 = 43;
int[] sub = { 10, 40, 0, 0, 0, 30, 0, 100, 0, 0, 0, 0 }; //should become [10, 40, -3, 30, -1, 100, -4]
//add data to bytes
dos.writeInt(data1);
dos.writeInt(data2);
int count_zero = 0;
for (int j : sub) {
if (j == 0) {
//System.out.println("Equals 0!");
count_zero = count_zero + 1;
} else {
if (count_zero != 0) {
dos.write(-1 * count_zero);
//System.out.println(-1 * count_zero);
count_zero = 0;
}
dos.writeInt(j); //orginally I just had this under the for loop and it works(if you delete the if data above)
}
}
byte[] bytes = baos.toByteArray();
System.out.println(bytes); //this is the data I send
//now bring it back
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
DataInputStream dis = new DataInputStream(bais);
System.out.println("****");
int data1_return = 0;
int data2_return = 0;
System.out.println("size of byte[] is " + bytes.length);
//ArrayList<Integer> sub_return = new ArrayList<Integer>();
int[] sub_return = new int[(bytes.length/4)-2]; //size of data minus first two intgers
for (int item = 0; item<(bytes.length/4);item++){
if (item == 0) {
data1_return = dis.readInt();
} else if (item == 1) {
data2_return = dis.readInt();
} else {
sub_return[item-2] = dis.readInt();
}
}
//print out the data
System.out.println(data1_return);
System.out.println(data2_return);
for (int i : sub_return) {
System.out.println(i);
}
}
}
它们不是正数和负数字节,它们是整数。因此,您应该将四个字节组合成一个整数。然后可以检查整数是否为负值或正值。此外,如果整数是负数,则四个整数中的第一个将在Little Endian中为负,在Big Endian中为最后一个。一个重要的评论是你的算法不会工作,因为尾部零不会被发送到接收器! –