我想我的主要问题是,只要我不重新初始化(新字节[#])作为参数传递的数组,这总是有效吗?
static unsafe decimal GetDecimal(byte[] ba)
{
decimal* decimal_PTR;
fixed (byte* byte_PTR = &ba[0])
{
decimal_PTR = ((decimal*)byte_PTR);
}
return *decimal_PTR;
}
我不确定 C# 如何处理内存中的数组。直到大约一个小时前我什至不知道他们是托管类型。我只是想知道如果我将小数作为 byte[] 传递,它总是返回正确的值吗?我们非常感谢您提供的任何其他信息。
最佳答案
@MJLaukala 通过评论进行澄清后:
.Net 中的数组是一个连续的内存块,就像任何其他语言一样。但与 C/C++ 不同的是,该 block 不仅存储数组的元素,还存储其他“信息”,包括数组的排名和长度。话虽如此, &ba[0] 将返回指向数组第一个元素的指针,您可以安全地递增指针直到最后一个元素。 ba.Length 将提供数组中元素的数量。
现在,如果您确定字节数组准确地表示小数,那么您的代码将正常工作。
十进制的内存布局(128位):
前2个字节为0
第3个字节包含0到28之间的值,表示96位整数部分除以10的幂以产生十进制值
第4个字节:前7位为零,第8位表示小数符号(1表示负数)
接下来的 12 个字节:小数的整数部分。
关于arrays - C# 数组如何存储在内存中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11219041/