谁能帮我。我有这个“非托管”.NET 代码,它可以在带有 MonoTouch 设备模拟器的 PC 平台和 OSX 上运行。但是当我在 iPad 2 设备上运行代码时,它会引发异常。我试图使代码变得简单以显示问题。
var buffer = new byte[ 8 ]; // Space for 2 float32.
float value = 123f;
fixed (byte* ptr = &buffer[1])
{
var fp = (float*)ptr;
*fp = value;
}
在我的设备上,当 &buffer[] 中的索引为 0、4 - 四个字节对齐为 float32 时,它可以工作,但其他所有字节都失败。
我很想知道,这是 MonoTouch 不安全实现中的一个错误,还是我错过了一些有关 .NET 和不安全代码的信息。
我已经做了一个解决方法,当句柄浮动时我是否在 4 字节缓冲区中读/写,然后将数据复制到数组中的正确位置,但如果我错过了解有关 . NET/iPad 设备浮点处理,否则这是一个错误。int64 类型没有问题。
由于与 PLC 设备的 tcp 通信,我们正在使用不安全的数组处理,我们是否使用 uint8/uint16 数组并传输数据块以获得更高的数据吞吐量。
如果有人有时间,这里有一个测试功能,尝试重现它:
BugTest(8); // Returns “S0,S1,S2,S3,S4,S5,S6,S7,” On my pc and mac with iPad simulator.
BugTest(8); // Returns “S0,F1,F2,F3,S4,F5,F6,F7,” On my iPad device.
unsafe string BugTest(int numberOfIndexesTest)
{
var testResult = new StringBuilder();
var buffer = new byte[ numberOfIndexesTest + sizeof(float)];
float value = 123f;
for(var index=0; index<numberOfIndexesTest;index++)
{
try
{
fixed (byte* ptr = &buffer[index])
{
var fp = (float*)ptr;
*fp = value;
testResult.AppendLine(string.Format("S{0},", index));
}
}
catch(Exception e)
{
testResult.AppendLine(string.Format("F{0},", index));
}
}
return testResult.ToString ();
}
非常感谢,
最好的问候, 卡斯帕沃勒森