我有一个脚本试图将图像转换为字节数组,但无法获取它来输出数组。
使用
Console.WriteLine(bytearray);
我只得到
的输出 System.Byte[]
以及尝试时
return bytearray;
我得到了错误
'Program.Main(string[])' returns void, a return keyword must not be
followed by an object expression
byte[] bytearray;
using (MemoryStream ms = new MemoryStream())
{
img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
bytearray = ms.ToArray();
Console.WriteLine (bytearray);
}
我想要将图像输出到控制台的字节数组。任何帮助将不胜感激,谢谢!
答案 0 :(得分:2)
Console.WriteLine
将string
输出到控制台。但是参数可以是任何对象,而不仅仅是字符串。因此,如果参数是其他类型(例如字节数组),则它将调用对象的ToString()
方法并将其写出。这始终有效,因为所有内容都继承自object
,因此每个对象都有一个ToString()
方法。
但是通常ToString()
方法不会被覆盖。因此,它只执行object.ToString()
即可返回对象类型的名称。
这就是为什么要这样做:
var byteArray = new byte[] { };
Console.WriteLine(byteArray);
您得到了:
System.Byte []
您可能想查看各个值,但是ToString()
不会返回该值。它只是返回类型的名称。因此,如果您想实际输出每个字节的值,则必须明确地做到这一点:
foreach(var b in byteArray)
Console.WriteLine(b);
现在您不打WriteLine(object)
。您正在呼叫WriteLine(int)
(因为byte
可以隐式转换为int
)。 int
可以表示为string
,因此现在它知道如何将值写入控制台。
只是为了好玩,并且为了说明这个概念,您可以编写这样的类:
public class MyBytes : List<byte>
{
public override string ToString()
{
return "These are my bytes:"
+ Environment.NewLine
+ string.Join(Environment.NewLine, this);
}
}
它从List<Byte>
继承并覆盖ToString()
。如果创建MyBytes
的实例,请填充它,并将其写入控制台:
var byteArray = new byte[] { 1, 2, 3 };
var myBytes = new MyBytes();
myBytes.AddRange(byteArray);
Console.WriteLine(myBytes);
您会看到它调用了您覆盖的ToString()
方法:
这些是我的字节数:
1
2
3
那只是为了说明。有时,如果我们知道要输出一个类的字符串表示形式,则覆盖ToString()
是有意义的,但是我不会仅仅为了覆盖ToString()
而创建整个类