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

时间:2016-02-17 04:45:28

标签: c# arrays object casting getvalue

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

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

因此,我无法访问它。问题是,无论谁写了这个类都没有定义任何Equals方法,所以我无法真正访问这些元素,但是调试器手表会显示这些值!

为该对象定义的唯一方法是GetTypeToStringSystem.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 而非值)。

我试过以下没有运气:

def calcBMI(weightlb, heightin):
   bmi = weightlb * 703/ heightin **2
   return bmi

def main():
    weightlb = float(input("Enter your weight in pounds: "))
    heightin = float(input("Enter your height in inches: "))`
    bmi = calcBMI(weightlb, heightin)
    print("Your BMI is %f" %bmi)

main()

让我疯狂的是,我可以使用监视窗口查看数组值,但是访问元素时遇到了问题。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

  • 您可以从您尝试查看的对象派生一个类,并且该类可以访问隐藏的数据。如果原始代码的数据成员的保护级别为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#并选择您最喜欢的参考网站。)

答案 2 :(得分:-1)

我必须以 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 [] 转换为列表并删除了额外的字节:

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;

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