C# {System.Byte[]}到System.Byte[]
我有一个对象,其属性之一是字节数组 我将该属性分配给名为C# {System.Byte[]}到System.Byte[],c#,arrays,object,casting,getvalue,C#,Arrays,Object,Casting,Getvalue,我有一个对象,其属性之一是字节数组 我将该属性分配给名为obj1的对象。当我将该属性赋给变量时,它会获取{System.Byte[]}类型,它是一个对象,而不是数组 因此,我无法访问它。问题是,编写该类的人没有定义任何.GetValue()方法,因此我无法真正访问元素,但调试器监视显示了这些值 为该对象定义的唯一方法是Equals、GetType和ToString(返回System.Byte,而不是值) 我尝试了以下方法,但没有任何运气: var vals = (System.Byte[])ob
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
使用watch窗口可以看到数组值,但访问元素时遇到问题,这让我抓狂 前两个赋值都是正确的,您应该能够使用
vals[0]
或vals.Length
等访问数组或其元素。调试器将看到所有值,包括无法通过代码引用的私有、不可访问的值。这是面向对象编程生活的一部分。如果您确实试图访问不可访问的数据,有几种方法可以在程序中访问这些数据:
- 您可以从试图查看的对象派生一个类,并且该类可以访问隐藏的数据。如果原始代码的数据成员保护级别为
,则会发生这种情况protected
- 您可以使用反射来访问私有数据成员,但这比我想象的要高级得多
for (int i = 0; i < vals.Length; i++) {
byte b = vals[i];
// do something with b ...
}
有关阵列的更多信息,请查看。(或者只需谷歌
阵列教程c 35;
并选择您最喜欢的参考站点。)我必须以图像格式将图像存储在MS SQL数据库中。我对它使用了一个SQL请求,但它将该图像作为对象{System.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[] obj = ObjectToByteArray(queryObject);
List<byte> list = obj.ToList();
list.RemoveRange(0, 27);
list.RemoveAt(list.Count - 1);
obj = list.ToArray<byte>();
也许这种方法是特定的,但它适用于图像。obj1的类型是什么?能否打印obj1.GetType()的输出?var vals=((System.Byte[])obj1)[0]访问元素时遇到什么问题?谢谢!我已经试着像普通数组一样对它进行索引,但没有成功。听到别人这么说我很放心。谢谢你的详尽答复。我已经试着像数组一样索引它;它不起作用。你对调试器的评论澄清了一切。我现在知道我应该和上课的人谈谈。对不起,我的问题是愚蠢的;我已经有5年没有用“真正的”语言编写代码了。
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;