将字节数组转换为double的问题

时间:2010-01-06 06:02:13

标签: c# winforms

我在使用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();
}

3 个答案:

答案 0 :(得分:6)

BitConverter.ToDouble(byte[], int)

使用8个字节构造一个64位双精度,这解释了你的问题(一旦你到达第7个到最后一个元素,就不再有8个字节)。根据你设置循环的方式,我猜这是你想做什么。

我想你想要的东西是:

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

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

答案 1 :(得分:1)

课程计划     {         static void Main(string [] 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);
                }



            }





    }
}

答案 2 :(得分:0)

我认为您需要稍微补充并解释您实际上要做的事情。每个BitConverter.ToDouble将8个连续字节转换为1个double。如果从字节数组中的下一个位置开始,则使用已经使用过的7个字节。由于每次转换需要8个字节,因此您需要在长度 - 7处停止。

无论如何,你最终会把数据的大小膨胀8倍。

我认为对此有何解释可能有助于您获得更好的答案。