{System.Byte[]} to System.Byte[]
本文关键字:Byte System to | 更新日期: 2023-09-27 18:35:01
我有一个对象,它的属性之一是字节数组。
我将该属性分配给名为 obj1
的对象。当我将该属性分配给变量时,它会获取{System.Byte[]}
类型,该类型是一个对象,而不是数组。
因此,我无法访问它。问题是,编写类的人没有定义任何.GetValue()
方法,所以我无法真正访问元素,但调试器手表显示值!
为该对象定义的唯一方法是 Equals
、 GetType
和 ToString
(返回 System.Byte
而不是值(。
我尝试了以下方法,但没有任何运气:
var vals = (System.Byte[])obj1 //Returns a {System.Byte[]} object
var vals = (obj1 as System.Byte[]) //Returns a {System.Byte[]} object
var vals = obj1.GetValue //Complains that GetValue is not defined
这让我发疯的是,我可以使用监视窗口查看数组值,但在访问元素时遇到问题。
你的前两个赋值都是正确的,你应该能够使用 vals[0]
或 vals.Length
等来访问数组或其元素
调试器将看到所有值,包括无法通过代码引用的私有、不可访问的值。 这是面向对象编程的一部分。 如果您确实尝试访问无法访问的数据,有几种方法可以在程序中访问此数据:
- 您可以从
- 尝试查看的对象派生一个类,该类将有权访问隐藏的数据。 如果原始代码的数据成员的保护级别为
protected
,则会发生这种情况。 - 您可以使用反射来访问私有数据成员,但这比我认为您要做的要先进得多。
我想知道您是否只是在寻找如何从阵列中访问数据? 如果你想从字节数组中获取数据,只需执行一个 for 循环:
for (int i = 0; i < vals.Length; i++) {
byte b = vals[i];
// do something with b ...
}
您也可以使用foreach
:
foreach (byte b in vals) {
{
// do something with b ...
}
查看 MSDN 的数组教程,了解有关阵列的详细信息。 (或者只是谷歌arrays tutorial c#
并选择你最喜欢的参考网站。
我有这个问题尝试这样的事情。
byte[] vByte = new byte[XLSStream.Length];
var stream = XLSStream.ToArray();
int count = 0;
foreach (var item in stream)
{
vByte[count] = item;
count++;
}
我必须以图像格式将图像存储在MS SQL数据库中。我为它使用了SQL请求,但它将图像作为object{System.Byte[]}返回给我。我找到了一个将其转换为 byte[] 的函数:
byte[] ObjectToByteArray(object obj)
{
if (obj == null)
return null;
BinaryFormatter bf = new BinaryFormatter();
using (MemoryStream ms = new MemoryStream())
{
bf.Serialize(ms, obj);
return ms.ToArray();
}
}
但不幸的是,结果与原始结果不同,包括 28 个额外的字节。我比较了两个数组,发现这个函数从数组的开头增加了 27 个字节,从数组的末尾增加了 1 个字节。我将 byte[] 转换为列表并删除了多余的字节:
byte[] obj = ObjectToByteArray(queryObject);
List<byte> list = obj.ToList();
list.RemoveRange(0, 27);
list.RemoveAt(list.Count - 1);
obj = list.ToArray<byte>();
我得到了一个与存储在数据库中相同的字节数组。然后我将其转换为原始图像:
MemoryStream ms = new MemoryStream(obj);
pictureBoxPhoto.Image = Image.FromStream(ms);
pictureBoxPhoto.SizeMode = PictureBoxSizeMode.Zoom;
也许这种方式是特定的,但它适用于图像。