短流[]
Stream of short[]
嗨,我需要计算一个文件的 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 我 tought 将其视为原始类型 short,将文件的每个 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);
}
}
但是我丢失了一个字节,我认为这不是最好的处理方式。
这是我想用按位运算符做的事情:
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 > 8 做这样的循环?
该循环不起作用,因为我必须连接多个字节并且每次都改变要连接的位数..
有什么想法吗?
谢谢
我认为你只需要一个字节数组:
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);
}
然后你就可以按照你的位操作来操作字节数据了。
--
如果你想使用短裤,你可以组合以这种方式读取的字节
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]]);
last 是短的,所以它可以放在 buffer[buffer.length-1] 中;我不确定缓冲区中的最后一个位置是否可用或已占用;我想是的,但是你需要在退出循环后检查 j ;如果 j 的值为 buffer.length-1 则可用;否则可能会出问题。
然后操作缓冲区。
第二种处理字节的方法更为复杂。这是它自己的问题。所以试试上面这个。
嗨,我需要计算一个文件的 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 我 tought 将其视为原始类型 short,将文件的每个 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);
}
}
但是我丢失了一个字节,我认为这不是最好的处理方式。
这是我想用按位运算符做的事情:
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 > 8 做这样的循环? 该循环不起作用,因为我必须连接多个字节并且每次都改变要连接的位数..
有什么想法吗? 谢谢
我认为你只需要一个字节数组:
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);
}
然后你就可以按照你的位操作来操作字节数据了。
--
如果你想使用短裤,你可以组合以这种方式读取的字节
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]]);
last 是短的,所以它可以放在 buffer[buffer.length-1] 中;我不确定缓冲区中的最后一个位置是否可用或已占用;我想是的,但是你需要在退出循环后检查 j ;如果 j 的值为 buffer.length-1 则可用;否则可能会出问题。
然后操作缓冲区。
第二种处理字节的方法更为复杂。这是它自己的问题。所以试试上面这个。