【问题标题】:{System.Byte[]} to System.Byte[]{System.Byte[]} 到 System.Byte[]
【发布时间】:2016-02-17 04:45:28
【问题描述】:

我有一个对象,其属性之一是字节数组。

我将该属性分配给名为obj1 的对象。当我将该属性分配给一个变量时,它会获取{System.Byte[]} 类型,它是一个对象,而不是一个数组。

因此,我无法访问它。问题是,编写该类的人没有定义任何.GetValue() 方法,所以我无法真正访问元素,但调试器监视显示了值!

为该对象定义的唯一方法是 EqualsGetTypeToString(返回 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

我可以使用监视窗口查看数组值,但在访问元素时遇到问题,这让我发疯。

【问题讨论】:

  • obj1的类型是什么?你能打印 obj1.GetType() 的输出吗?
  • var vals = ((System.Byte[])obj1)[0]
  • 您在访问该元素时遇到了什么样的问题?

标签: c# arrays object casting getvalue


【解决方案1】:

您的前两个分配都是正确的,您应该能够使用 vals[0]vals.Length 等访问数组或其元素

【讨论】:

  • 谢谢!我已经尝试像普通数组一样索引它,但没有奏效。从别人那里听到它让人放心
【解决方案2】:

调试器将看到所有值,包括您无法通过代码引用的私有、不可访问的值。这是面向对象编程生活的一部分。如果您真的想访问无法访问的数据,可以通过以下几种方式在程序中访问这些数据:

  • 您可以从您要查看的对象派生一个类,并且该类将有权访问隐藏的数据。如果原始代码的数据成员的保护级别为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's Arrays tutorial 了解有关阵列的更多信息。 (或者只是谷歌arrays tutorial c# 并选择你最喜欢的参考网站。)

【讨论】:

  • 非常感谢您的详尽回复。我已经尝试像数组一样索引它;它不起作用。您对调试器的评论澄清了一切。我现在知道我应该和上课的人谈谈。对不起,我的问题很愚蠢;我已经有 5 年没有用“真正的”语言编写代码了。
【解决方案3】:

我必须将图像以 image 格式存储在 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[] 转换为 List 并删除了多余的字节:

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;

也许这种方式是特定的,但它适用于图像。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-03
    • 2011-01-27
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 2013-05-20
    • 2011-02-17
    相关资源
    最近更新 更多