java - 如何识别从 byte[] 转换而来的具有负值的 int?

标签 java

我有一个奇怪的问题。基本上,我使用的队列服务器仅接受 byte[] 形式的输入,因此我采用两个 int 和 int[] 并使用 ByteArrayOutputStream 转换它们。到目前为止它工作得很好,但是当我从队列中来回传输大量消息时,我试图压缩我的 int[] (它有几千个项目,但大多数都是零)。我想到了采用零序列并将它们变成负值(请参阅此问题的答案 question

但是我遇到了问题,因为为了将我的 bytes[] 转换回原始格式,我使用了 byte[] 的长度并将其除以 4(因为每个 int 的大小都是 4,然后循环遍历它) )。由于我在列表中引入了负值,因此大小发生了变化(每个负值改变 1),这使我无法解压数据。我尝试了不同的方法将数据放入 Byte[] 中,而 ByteArrayOutputStream 似乎是迄今为止我尝试过的最快的方法,除非有更快的方法,否则我更喜欢坚持使用这种方法。同样在我的链接问题中,接受的答案有一种方法似乎完全适合我已经用来隐藏数据的现有 for 循环结构(用零序列的负数替换所有零的解决方案)。

有什么想法可以区分正/负字节流吗?

代码如下:

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);
        }

    }

}

最佳答案

最简单的方法可能是在开始时对完整列表的大小进行编码,因此您将拥有 {0, 0, 0, 6, 0, 1, 2, 3, -5} - 然后你只需将前 4 个字节作为 int 读取,发现它们等于 6,分配一个 int[6],并将流的其余部分解压缩为它。

关于java - 如何识别从 byte[] 转换而来的具有负值的 int?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10374013/

相关文章:

java - 如何转换 2 个日期,一个为 BST(当前日期),另一个为 GMT,以便可以比较方法之前和之后的日期?

java - 如何安装Java EE?

java - 我目前正在使用文本编辑器,需要一些帮助来制作 "undo change"函数

java - 玩!框架运行抛出 UnsupportedClassVersionError

java - 客户端套接字接受的数据与服务器套接字不同

java - 如何在java中使用LIKE %编写正确的语句

java - 将Java连接到MySQL数据库

java - 如何在一个测试方法中创建单个类的模拟和非模拟实例?

java - 设计一个可移植到多种语言的 GUI

java - 如何确定数组是否包含 Java 中的特定值?