对于无符号字节C#,该值太小或太大

时间:2017-10-01 19:31:52

标签: c# winforms byte overflowexception

我有两种方法,如下所示,我无法使其工作。我正在尝试从.png打开OpenFileDialog文件并将其显示在ImageBox上:

public static Bitmap ToBitmap(this string input)
{
    List<byte> splitBytes = new List<byte>();
    string byteString = "";
    foreach (char i in input)
    {
        byteString += i;
        if (byteString.Length == 3)
        {
            splitBytes.Add(Convert.ToByte(byteString));
            byteString = "";
        }
    }
    if (byteString != "")
        splitBytes.AddRange(Encoding.ASCII.GetBytes(byteString));
    using (var ms = new MemoryStream(splitBytes.ToArray()))
    {
        var img = Image.FromStream(ms);
        Bitmap output = new Bitmap(img);
        return output;
    }
}

public static string StringFromFile(string input)
{
    StreamReader sr = new StreamReader(input);
    string file = string.Empty;
    while (sr.EndOfStream == false)
    {
        file += sr.Read();
    }
    return file;
}

在另一个文件中,我尝试使用该方法:

OpenFileDialog OFD = new OpenFileDialog();
OFD.Filter = "Images (*.png)|*.png";
OFD.ShowDialog();
pictureBox1.BackgroundImageLayout = ImageLayout.Stretch;
pictureBox1.BackgroundImage = StringToBitmapConverter.ToBitmap(StringToBitmapConverter.StringFromFile(OFD.FileName));

但我得到了这个例外:

  

System.OverflowException:&#39;对于无符号字节,值太大或太小。&#39;

请帮忙! 我在一个名为StringToBitmapConverter的类中使用这些方法,并且有一个错误给我带来麻烦,任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:1)

所以根据documentation Convert.ToByte(string value)

  

将指定的数字字符串表示形式转换为等效的8位无符号整数。

如果符合以下条件,该方法将抛出OverflowException

  

值表示小于Byte.MinValue或大于Byte.MaxValue的数字。

因此byteString的值在此行必须小于0或大于255:

splitBytes.Add(Convert.ToByte(byteString));

答案 1 :(得分:0)

您可以使用try {} catch来捕获错误,或使用byte.TryParse仅转换那些实际可转换的数字。

从文件中读取文本可以通过File.ReadAllText

完成

您的algorythm将读取的文本拆分为3个字符块,并将文本解释为byte:

&#34; 23405716119228936&#34; - &GT; 234,57,161,192,289,36 .... 289不适合一个字节 - &gt;例外。检查文件内容。

for (col, mean) in zip(df.columns, means):
    df[col].fillna(mean, inplace=True)

编辑#1:

我想在PNG文件中阅读&#34;字符串&#34;并且像你一样转换它们不起作用。

PNG文件具有内部格式,它们是经过编码的。看到 https://www.w3.org/TR/PNG/ 要么 https://de.wikipedia.org/wiki/Portable_Network_Graphics

它们不是字符串,您只需将其分组为3个字符,转换为字节并重新解释为内存字符串。

对于咯咯笑声,请在您的文件中尝试此操作,看看您的输入是什么。:

if (byte.TryParse(byteString, out var b))
{
    splitBytes.Add(b);
}
else
{
    // this thing is not convertable to byte, do something with it....
}

答案 2 :(得分:0)

如果您正在尝试打开一个png,那么您可以丢弃大部分代码并将其简化为

OpenFileDialog OFD = new OpenFileDialog();
OFD.Filter = "Images (*.png)|*.png";
var result = OFD.ShowDialog()    
if(result == DialogResult.OK) //You need to check to see if they clicked OK or Cancel.
{
    pictureBox1.BackgroundImageLayout = ImageLayout.Stretch;

    var oldImage = pictureBox1.BackgroundImage
    pictureBox1.Image = new Bitmap(OFD.FileName); //Shouold be Image, not BackgroundImage for a picture box.
    if(oldImage != null)
    {
        oldImage.Dispose();
    }

}