短流[]

时间:2016-03-03 13:23:49

标签: java inputstream entropy datainputstream

嗨我需要计算文件的阶数m的熵,其中m是比特数(m <= 16)。

所以:

H_m(X)= - sum_i = 0到i = 2 ^ m-1 {(p_i,m)(log_2(p_i,m))}

所以,我想创建一个输入流来读取文件,然后计算由m位组成的每个序列的概率。

对于m = 8,这很容易,因为我考虑一个字节。 由于m <= 16 I我认为是原始类型short,所以将文件的每个短路保存在数组short []中,然后使用按位运算符操作位以获得文件中m位的所有序列。 这是个好主意吗?

无论如何,我无法创建短片流。这就是我所做的:

public static void main(String[] args) {
    readFile(FILE_NAME_INPUT);
}

public static void readFile(String filename) {
    short[] buffer = null;
    File a_file = new File(filename);
    try {
        File file = new File(filename);

        FileInputStream fis = new FileInputStream(filename);
        DataInputStream dis = new DataInputStream(fis);

        int length = (int)file.length() / 2;
        buffer = new short[length];

        int count = 0;
        while(dis.available() > 0 && count < length) {
            buffer[count] = dis.readShort(); 
            count++;
        }
        System.out.println("length=" + length);
        System.out.println("count=" + count);


        for(int i = 0; i < buffer.length; i++) {
            System.out.println("buffer[" + i + "]: " + buffer[i]);
        }

        fis.close();
    }
    catch(EOFException eof) {
        System.out.println("EOFException: " + eof);
    }
    catch(FileNotFoundException fe) {
        System.out.println("FileNotFoundException: " + fe);
    }
    catch(IOException ioe) {
        System.out.println("IOException: " + ioe);
    }
}

但是我失去了一个字节,我认为这不是最好的程序方式。

这是我想用bitwise运算符做的事情:

int[] list = new int[l];
foreach n in buffer {
    for(int i = 16 - m; i > 0; i-m) {
        list.add( (n >> i) & 2^m-1 );
    }
}

我假设在这种情况下使用短裤。 如果我使用字节,我怎么能像m&gt;那样做一个循环呢? 8? 这个循环不起作用,因为我必须连接多个字节,每次都要改变要连接的位数。

有什么想法吗? 感谢

1 个答案:

答案 0 :(得分:1)

我认为你只需要一个字节数组:

public static void readFile(String filename) {
  ByteArrayOutputStream outputStream=new ByteArrayOutputStream();
  try {
    FileInputStream fis = new FileInputStream(filename);
    byte b=0;
    while((b=fis.read())!=-1) {
        outputStream.write(b);
    }
    byte[] byteData=outputStream.toByteArray();
    fis.close();
  }
  catch(IOException ioe) {
    System.out.println("IOException: " + ioe);
}

然后你可以按照你的按位操作来操作byteData。

-

如果你想使用短片,你可以用这种方式组合字节

short[] buffer=new short[(int)(byteData.length/2.)+1];
j=0;
for(i=0; i<byteData.length-1; i+=2) {
  buffer[j]=(short)((byteData[i]<<8)|byteData[i+1]);
  j++;
}

要检查奇数字节,请执行此操作

if((byteData.length%2)==1) last=(short)((0x00<<8)|byteData[byteData.length-1]]);

最后是短的,所以它可以放在缓冲区[buffer.length-1];我不确定缓冲区中的最后一个位置是否可用或占用;我想是的,但你需要在退出循环后检查j;如果j的值是buffer.length-1那么它是可用的;否则可能会出现问题。

然后操纵缓冲区。

使用字节的第二种方法更复杂。这是一个自己的问题。所以试试这个。