繁体   English   中英

{System.Byte[]} 到 System.Byte[]

[英]{System.Byte[]} to System.Byte[]

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

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

结果,我无法访问它。 问题是,编写 class 的人没有定义任何.GetValue()方法,所以我无法真正访问元素,但调试器手表显示了值!

为该 object 定义的唯一方法是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

我可以使用手表 window 查看数组值,但我无法访问元素,这让我发疯。

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

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

  • 您可以从您尝试查看的 object 中派生出 class ,并且 class 将有权访问隐藏数据。 如果原始代码将数据成员的保护级别设置为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 教程,了解有关 arrays 的更多信息。 (或者只是谷歌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[]}的形式返回了我的图像。 我找到了一个 function 将其转换为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 个额外字节 我比较了两个 arrays 并发现这个 function 从数组的开头添加了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;

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM