【问题标题】:Converting bytes to int将字节转换为 int
【发布时间】:2016-02-20 23:05:34
【问题描述】:

在我的项目中,我需要打开 SEQ 文件,所以我使用 FileInputStream,它需要将数据加载到字节数组中。但正因为如此,每个像素都会得到错误的值(因为它们是整数)。

在我的代码下面,您可以看到我将像素放入二维数组中,为此我计算像素的每个值:

 wart =(int) (buf[offset]) +(int)(buf[offset+1]) * 255;

我知道由于字节输入格式而导致的值是错误的(前两个像素也就是双精度应该是 152,109692453756 and 152,068644316116 但在我的 Java 函数中他们得到 -2474, -690

我尝试使用面具:

wart =(int) (buf[offset]<< 8) & 0x0000ff00 +(int)(buf[offset+1])& 0x000000ff * 255  ;

它有点帮助(值不是负数,但它们“偏移”太多(前两个像素19456, 18944) 我不知道如何解决这个问题。知道mask应该不一样,但是不知道怎么设置。

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

我知道这是一团糟,很多东西都被评论了:)

【问题讨论】:

  • 请发布一段读取和存储数据的代码,并提供一个数据看起来如何的示例,然后我们可以尝试提供帮助
  • 必修课; sscce.org

标签: java int type-conversion byte mask


【解决方案1】:

先戴口罩,像这样:

wart = (buf[offset] & 0xFF) | ((buf[offset+1] & 0xFF) << 8);

【讨论】:

  • 对于前两个“疣”,我得到了 63052、64843
  • @KatarzynaKamińska 那又怎样?你期望得到什么?
  • 有点像 152、152。我是初学者,所以对我来说很难理解 :(
  • @KatarzynaKamińska 这里有一些可能性:1)你的偏移量是错误的,所以你使用了错误的输入,2)数据是大端而不是小端,所以字节被交换了,或 3)您需要通过一些归一化因子来缩放整数值(除以某个常数?)
  • 如果数据是大端而不是小端怎么办?
【解决方案2】:

255 错了

它是 256,你总是要乘以你正在操作的基数的倍数,255 不是 2 的倍数

类比:

以您的方式将 111 从以 10 为基数转换为以 10 为基数

1*99 + 1*9 + 1 = 109

所以 109 != 111 是错误的,同样乘以 255 会改变您尝试从二进制转换为二进制的任何数字。

【讨论】:

    猜你喜欢
    • 2016-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 2011-09-04
    • 2017-12-21
    相关资源
    最近更新 更多