2

我想我的主要问题是,只要我不重新初始化(新字节 [#])作为参数传递的数组,这是否总是有效?

static unsafe decimal GetDecimal(byte[] ba)
{
    decimal* decimal_PTR;
    fixed (byte* byte_PTR = &ba[0])
    {
        decimal_PTR = ((decimal*)byte_PTR);
    }
    return *decimal_PTR;
}

我不确定 C# 如何处理内存中的数组。直到大约一个小时前,我什至不知道它们是托管类型。我只想知道如果我将小数作为字节 [] 传递,它是否总是返回正确的值?感谢您提供任何其他信息。

4

1 回答 1

3

在@MJLaukala 通过评论澄清后:

  1. .Net 中的数组是一块连续的内存,就像任何其他语言一样。但与 C/C++ 不同,此块不仅存储数组的元素,还存储其他“信息”,包括数组的等级和长度。话虽如此,&ba[0] 将返回指向数组第一个元素的指针,您可以安全地递增指针直到最后一个元素。ba.Length 将提供数组中元素的数量。

  2. 现在,如果您确定字节数组完全代表小数,那么您的代码将正常工作。

十进制的内存布局(128位):

前 2 个字节为 0

第 3 个字节包含 0 到 28 之间的值,表示 10 的幂除以 96 位整数部分以产生十进制值

第 4 字节:前 7 位为零,第 8 位表示小数的符号(1 表示负数)

接下来的 12 个字节:十进制的整数部分。

于 2012-06-27T11:33:02.350 回答