Xamarin-从NSDATA类的IntPtr复制数据.字节属性到 uint16 var



我正在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 UInt16ushort,您可以使用

ushort value = (ushort)(bytes[0] | (bytes[1] << 8))

更新

对于小端序uint (objc UInt32),转换将如下所示

uint value = bytes[0] | (bytes[1] << 8) | (bytes[2] << 16) | (bytes[3] << 24);

相关内容

最新更新