2012-06-27 31 views
2

我想我的主要问题是,只要我不重新初始化(新字节[#])作为参数传递的数组,它会一直工作吗?我不确定C#如何处理内存中的数组。直到大约一个小时之前,我甚至都不知道它们是被管理的类型。我只是想知道如果我传递一个小数点作为byte [],它会始终返回正确的值吗?任何其他信息,你可以提供赞赏。C#数组如何存储在内存中

+0

另外,在函数的开头创建一个小数,然后在固定块中,使它等于((decimal *)byte_PTR指向的值),然后返回创建的小数? – MJLaukala

+0

我可以知道如何获取字节[] ?.答案取决于这些信息。 –

+0

byte []是使用NetworkStream.Read(byte [] buffer,int offset,int size)通过网络连接发送的消息的一部分。上面的示例方法与实现略有不同,但传递给该方法的数组与传递给NetworkStream.Read的数组是相同的。这是一个仅限Windows的程序,所以我确实相信我不需要担心字节序。 – MJLaukala

回答

2

后@ MJLaukala的澄清过评论:

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

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

内存布局(128位):

前2个字节是0

第三字节包含0和28之间的值,表示10的幂来划分96位由整数部分以产生十进制值

第四字节:第一7位均为零,第八位表示的十进制(1含义负)

接下来的12字节的符号:整数部分的小数。

+0

非常感谢您的澄清!这是我绝对不会忘记的信息。 – MJLaukala

+0

为什么不能只是'struct Decimal {long integer;长分数; }'并用'integer.fractional'表示? '42.13'会是'{integer = 42;小数= 13}'。 –

+0

这是一个经典的'为什么浮点表示优于定点表示'的问题。你的符号是一个最大值为10^18的定点符号(检查长的最大值)。浮点表示(如小数点)允许更大的范围。小数的最大值为10^29的数量级。 –