我想我的主要问题是,只要我不重新初始化(新字节[#])作为参数传递的数组,它会一直有效吗?
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 []传递,它是否总是返回正确的值?您可以提供任何其他信息。
答案 0 :(得分:2)
在@MJLaukala通过评论澄清之后:
.Net中的数组是一个连续内存块,就像任何其他语言一样。但与C / C ++不同,这个块不仅存储数组的元素,还存储其他“信息”,包括数组的等级和长度。说完这个之后,& ba [0]会将指针返回到数组的第一个元素,你可以安全地将指针递增到最后一个元素。 ba.Length将提供数组中元素的数量。
现在,如果您确定字节数组完全代表小数,那么您的代码将正常工作。
十进制内存布局(128位):
前2个字节为0
第3个字节包含0到28之间的值,表示10的幂以将96位整数除以产生十进制值
第4个字节:前7位为零,第8位表示小数符号(1表示负数)
接下来的12个字节:Decimal的整数部分。