我正在Xamarin.ios平台创建一个blutooth应用程序。我在整理来自我的应用程序连接的外围设备的数据时遇到问题。我有低于目标的 c 代码,但我很难将其转换为 C#。因为我不确定如何在 c# 中溢出字节数组。如何正确从设备接收数据的任何建议。我想过使用 Marshal 类,但不确定它是否与 iOS 操作系统级别相同。
这是客观的C代码,在iOS操作系统级别上运行良好
UInt16 cValue;
[characteristic.value getBytes:&cValue length:2];
如您所见,它从Apple API调用NSDATA类的getBytes方法,该方法可以解决问题,但我在Xamarin.ios API的NSDATA类中找不到类似的东西。
这就是我想在 C# 中这样做的:
byte []destination=new byte[16]();
Marshal.Copy(characteristic.Value.Bytes,destination,2, Not Sure about length);
这是我使用的封送方法。
http://msdn.microsoft.com/en-us/library/vstudio/ms146631
最后,我不确定字节[16],我只是假设因为目标c中的Uint16是8位无符号整数。
首先,UInt16
是一个 16 位无符号整数。 byte[16]
是一个 16 字节的 8 位无符号整数数组。
您需要一个byte[2]
来存储Uint16。
byte[] bytes = new byte[characteristic.Value.Length];
Marshal.Copy(characteristic.Value.Bytes, bytes, 0, Convert.ToInt32(characteristic.value.Length));
要最终转换为等效于 Objective-C UInt16
的ushort
,您可以使用
ushort value = (ushort)(bytes[0] | (bytes[1] << 8))
更新
对于小端序uint
(objc UInt32),转换将如下所示
uint value = bytes[0] | (bytes[1] << 8) | (bytes[2] << 16) | (bytes[3] << 24);