Xamarin.ios 单触式和不安全浮点

Xamarin.ios 单触式和不安全浮点,xamarin.ios,arm,unmanaged,unsafe,memory-alignment,Xamarin.ios,Arm,Unmanaged,Unsafe,Memory Alignment,有人能帮我吗。我有这个“非托管的”.NET代码,它可以在PC平台和带有MonoTouch设备模拟器的OSX上运行。但当我在iPad2设备上运行代码时,它抛出了一个异常。我试图使代码简单化,以显示问题 var buffer = new byte[ 8 ]; // Space for 2 float32. float value = 123f; fixed (byte* ptr = &buffer[1]) {

有人能帮我吗。我有这个“非托管的”.NET代码,它可以在PC平台和带有MonoTouch设备模拟器的OSX上运行。但当我在iPad2设备上运行代码时,它抛出了一个异常。我试图使代码简单化,以显示问题

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-4字节时,它可以工作,但在所有其他设备上都失败

我很想知道,是MonoTouch不安全实现中的一个bug还是我遗漏了一些关于.NET和不安全代码的信息

我已经做了一个变通,当句柄浮动时,我在4字节缓冲区中读/写数据,然后将数据复制到数组中的正确位置,但是如果我不了解.NET/iPad设备浮点处理的某些内容,或者这是一个bug,那么我还是很高兴知道。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 ();
}
BugTest(8);//使用iPad模拟器在我的pc和mac上返回“S0、S1、S2、S3、S4、S5、S6、S7”。
错误测试(8);//在我的iPad设备上返回“S0、F1、F2、F3、S4、F5、F6、F7”。
不安全字符串错误测试(int numberOfIndexesTest)
{
var testResult=新的StringBuilder();
var buffer=新字节[numberOfIndexesTest+sizeof(float)];
浮点数=123f;

对于(var index=0;index < p>)这不是单调的问题,因为在C、C++、ObjectiveC……/P>中会有相同的问题。 iOS设备中使用的ARM处理器要求
float
在4字节边界上对齐。x86体系结构没有此要求-这就是它在模拟器、OSX、Windows上工作的原因


更新:

谢谢你的回答。很高兴知道例外情况是什么。没问题。一旦问题解决,你应该将问题标记为已回答(绿色标记,你可以单击),以便其他搜索stackoverflow的人可以看到有可用的答案。如果你只喜欢答案(但不认为它是完整的)然后你可以“向上投票”它(向上箭头)。当然你可以同时做这两件事(向上投票和按回答标记)。如果有疑问,请查看常见问题解答-欢迎访问stackoverflow.com