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循环:

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;