2010-01-06 30 views
0

我有一个问题,使用BitConverter.ToDouble()将字节数组转换为双数组。转换字节数组为双倍的问题

只要我的程序将选择一个图像,然后将图像转换为字节数组。 然后它会将字节数组转换为双数组。

当我将字节数组转换为double时,在循环完成之前会出现此错误。

(目标数组不够长,所有的项目复制收藏。检查数组索引和长度。)

误差在array.Length-7位究竟发生是之前的最后一个最后的第七位在阵列上的位置。

我需要帮助解决这个问题,这里是我的代码:

private Bitmap loadPic; 
byte[] imageArray; 
double[] dImageArray; 

private void btnLoad_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     OpenFileDialog open = new OpenFileDialog(); 
     open.Filter = "Image Files(*.jpg; *.jpeg; *.gif; *.bmp)|*.jpg; *.jpeg; *.gif; *.bmp"; 

     if (open.ShowDialog() == DialogResult.OK) 
     { 
      pictureBox1.Image = new Bitmap(open.FileName); 
      loadPic = new Bitmap(pictureBox1.Image); 
     } 
    } 
    catch 
    { 
     throw new ApplicationException("Failed loading image"); 
    } 

    pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; 
} 

private void btnConvert_Click(object sender, EventArgs e) 
{ 
    imageArray = imageToByteArray(loadPic); 
    int index = imageArray.Length; 
    dImageArray = new double[index]; 

    for (int i = 0; i < index; i++) 
    { 
     dImageArray[i] = BitConverter.ToDouble(imageArray,i); 
    } 
} 

public byte[] imageToByteArray(Image imageIn) 
{ 
    MemoryStream ms = new MemoryStream(); 
    imageIn.Save(ms, ImageFormat.Gif); 
    return ms.ToArray(); 
} 

回答

6
BitConverter.ToDouble(byte[], int) 

使用八个字节来构建一个64位双,这说明您的问题(一旦你到了7日最后一个元素,不再有八个字节)。我猜这是而不是你想要做什么,根据你如何设置你的循环。

我想像你想要的东西,如:

for(int i = 0; i < index; i++) 
{ 
    dImageArray[i] = (double)imageArray[i]; 
} 

编辑 - 或使用LINQ,只是为了好玩:

double[] dImageArray = imageArray.Select(i => (double)i).ToArray(); 

在另一方面...

如果BitConverter绝对是你想要的,那么你需要像这样的东西:

double[] dImageArray = new double[imageArray.Length/8]; 
for (int i = 0; i < dImageArray.Length; i++) 
{ 
    dImageArray[i] = BitConverter.ToDouble(imageArray, i * 8); 
} 

再次,根据您的代码,我认为第一个解决方案就是您需要的。

+0

不,这不是它。您正在使用演员阵容,这将产生与BitConverter完全不同的结果。 –

+1

我刚刚澄清了我的帖子,指出基于他的循环(和他的数组初始化),我不认为BitConverter是他想要的。 – Sapph

+0

是的,我认为你是对的。 +1 –

0

我认为你需要备份一下并解释你实际上想要做什么。每个BitConverter.ToDouble将8个连续字节转换为1个双精度型。如果从字节数组的下一个位置开始,则使用已使用的7个字节。由于每次转换都需要8个字节,则需要在长度停止 - 7

不管怎样,你要结束了由8

的因素,我认为一些解释充气数据的大小这是什么可能会帮助你得到一些更好的答案。

+0

谢谢各位回复。 我所需要的就是创建一个数组来使用它来处理自组织映射神经网络作为输入数组。 将图像传递到神经网络。 – Eyla

1

类节目 { 静态无效的主要(字串[] args){

 Program p = new Program(); 
     p.Test(); 
    } 

    private void Test() 
    { 

     Image i = Image.FromFile(@"C:\a.jpg"); 

     Bitmap b = new Bitmap(i); 

     MemoryStream ms = new MemoryStream(); 

     b.Save(ms, System.Drawing.Imaging.ImageFormat.Gif); 

     byte[] by = ms.ToArray(); 

     double[] db = new double[(int)(Math.Ceiling((double)by.Length/8))]; 



     int startInterval = 1; 
     int interval = 8; 
     int k = 0; 
     byte[] bys = new byte[8]; 
     int n = 1; 

      for (int m = startInterval; m <= interval && m<=by.Length; m++,n++) 
      { 
       bys[n-1] = by[m-1]; 


       if (m == interval) 
       { 


        db[k] = BitConverter.ToDouble(bys, 0); 
        startInterval += 8; 
        interval += 8; 
        k++; 
        n = 0; 
        Array.Clear(bys, 0, bys.Length); 

       } 

       if (m == by.Length) 
       { 
        db[k] = BitConverter.ToDouble(bys, 0); 
       } 



      } 





    } 
}