将字节转换为 int
Converting bytes to int
在我的项目中我需要打开SEQ文件,所以我使用FileInputStream,它需要加载数据到字节数组。但正因为如此,每个像素都会得到错误的值(因为它们是整数)。
在我的代码下方,您可以看到我将像素放在二维数组中,为此我计算像素的每个值,行:
wart =(int) (buf[offset]) +(int)(buf[offset+1]) * 255;
我知道由于字节输入格式的值是错误的(前两个像素又名 double 应该是 152,109692453756 and 152,068644316116
但在我的 Java 函数中它们得到 -2474, -690
)
我试过使用面具:
wart =(int) (buf[offset]<< 8) & 0x0000ff00 +(int)(buf[offset+1])& 0x000000ff * 255 ;
有点帮助(值不是负值,但它们 "shifted" 太多了(前两个像素 19456, 18944
)
我不知道如何解决这个问题。我知道掩码应该不同,但我不知道怎么设置。
public class Sekwencja2 {
@SuppressWarnings("empty-statement")
public double[] sekwencja2(String nazwa,int nr_klatki) throws FileNotFoundException, IOException{
InputStream is = null;
DataInputStream dis = null;
is = new FileInputStream(nazwa);
dis = new DataInputStream(is);
int length = dis.available();
byte[] buf = new byte[length];
dis.readFully(buf);
int l_klatek = ((length-158864)/158864)+1;
int width = 320;
int height = 240;
int C1=21764040;
double C2=3033.3;
double C3=134.06;
int z = 0;
double[] oneDArray = new double[width*height];
double [][] pixels = new double[width][height];
int offset =0;
char type;
String typeText;
type=(char)buf[0];
typeText =Character.toString(type);
switch (typeText) {
case "A":
if(nr_klatki == 1)
offset= 696;
else
offset = 158136+(nr_klatki-1)*569+(nr_klatki-2)*(320*240*2+3839);
break;
case "F":
offset=(nr_klatki-1)*158864 + 1373;
break;
}
int wart = 0 ;
for(int x = 0; x<320; x++){
for (int y = 0; y<240;y++){
switch (typeText){
case "A":
if(nr_klatki==1)
wart =(int) (buf[offset]) +(int)(buf[offset+1]) * 255;
else
wart = (int)(buf[offset]<< 8)& 0x0000ff00 +(int)(buf[offset+1])&0xff*255 ;
break;
case "F":
wart = (buf[offset]<< 8)& 0x0000ff00 +(buf[offset+1])& 0x000000ff * 255 ;
break;
}
System.out.print(", "+wart);
pixels[x][y]=wart;
offset = offset+2;
}
}
for(int i = 0; i < width; i ++)
{
System.arraycopy(pixels[i], 0, oneDArray, i * height, height);
}
return oneDArray;
}
}
我知道这很乱,很多东西都被评论了:)
先戴口罩,像这样:
wart = (buf[offset] & 0xFF) | ((buf[offset+1] & 0xFF) << 8);
255错了
是256,你总是要乘以你运算的基数的倍数,255不是2的倍数
类比:
按照您的方式将 111 从 10 进制转换为 10 进制
1*99 + 1*9 + 1 = 109
所以 109 != 111 这是错误的,同样乘以 255 将改变您尝试从二进制转换为二进制的任何数字。
在我的项目中我需要打开SEQ文件,所以我使用FileInputStream,它需要加载数据到字节数组。但正因为如此,每个像素都会得到错误的值(因为它们是整数)。
在我的代码下方,您可以看到我将像素放在二维数组中,为此我计算像素的每个值,行:
wart =(int) (buf[offset]) +(int)(buf[offset+1]) * 255;
我知道由于字节输入格式的值是错误的(前两个像素又名 double 应该是 152,109692453756 and 152,068644316116
但在我的 Java 函数中它们得到 -2474, -690
)
我试过使用面具:
wart =(int) (buf[offset]<< 8) & 0x0000ff00 +(int)(buf[offset+1])& 0x000000ff * 255 ;
有点帮助(值不是负值,但它们 "shifted" 太多了(前两个像素 19456, 18944
)
我不知道如何解决这个问题。我知道掩码应该不同,但我不知道怎么设置。
public class Sekwencja2 {
@SuppressWarnings("empty-statement")
public double[] sekwencja2(String nazwa,int nr_klatki) throws FileNotFoundException, IOException{
InputStream is = null;
DataInputStream dis = null;
is = new FileInputStream(nazwa);
dis = new DataInputStream(is);
int length = dis.available();
byte[] buf = new byte[length];
dis.readFully(buf);
int l_klatek = ((length-158864)/158864)+1;
int width = 320;
int height = 240;
int C1=21764040;
double C2=3033.3;
double C3=134.06;
int z = 0;
double[] oneDArray = new double[width*height];
double [][] pixels = new double[width][height];
int offset =0;
char type;
String typeText;
type=(char)buf[0];
typeText =Character.toString(type);
switch (typeText) {
case "A":
if(nr_klatki == 1)
offset= 696;
else
offset = 158136+(nr_klatki-1)*569+(nr_klatki-2)*(320*240*2+3839);
break;
case "F":
offset=(nr_klatki-1)*158864 + 1373;
break;
}
int wart = 0 ;
for(int x = 0; x<320; x++){
for (int y = 0; y<240;y++){
switch (typeText){
case "A":
if(nr_klatki==1)
wart =(int) (buf[offset]) +(int)(buf[offset+1]) * 255;
else
wart = (int)(buf[offset]<< 8)& 0x0000ff00 +(int)(buf[offset+1])&0xff*255 ;
break;
case "F":
wart = (buf[offset]<< 8)& 0x0000ff00 +(buf[offset+1])& 0x000000ff * 255 ;
break;
}
System.out.print(", "+wart);
pixels[x][y]=wart;
offset = offset+2;
}
}
for(int i = 0; i < width; i ++)
{
System.arraycopy(pixels[i], 0, oneDArray, i * height, height);
}
return oneDArray;
}
}
我知道这很乱,很多东西都被评论了:)
先戴口罩,像这样:
wart = (buf[offset] & 0xFF) | ((buf[offset+1] & 0xFF) << 8);
255错了
是256,你总是要乘以你运算的基数的倍数,255不是2的倍数
类比:
按照您的方式将 111 从 10 进制转换为 10 进制
1*99 + 1*9 + 1 = 109
所以 109 != 111 这是错误的,同样乘以 255 将改变您尝试从二进制转换为二进制的任何数字。