Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Xamarin-将NSDATA class.Bytes属性的IntPtr中的数据复制到uint16变量中_Ios_.net_Xamarin.ios_Core Bluetooth - Fatal编程技术网

Ios Xamarin-将NSDATA class.Bytes属性的IntPtr中的数据复制到uint16变量中

Ios Xamarin-将NSDATA class.Bytes属性的IntPtr中的数据复制到uint16变量中,ios,.net,xamarin.ios,core-bluetooth,Ios,.net,Xamarin.ios,Core Bluetooth,我正在Xamarin.ios平台上创建一个blutooth应用程序。我在整理来自我的应用程序连接的外围设备的数据时遇到问题。我有以下目标c代码,但我很难将其转换为c。因为我不知道如何在c#中拆分字节数组。任何关于如何从设备正确接收数据的建议。我曾想过使用封送处理类,但不确定它是否与在iOS操作系统级别上执行的操作相同 这是objective c代码,在iOS操作系统级别上运行良好 UInt16 cValue; [characteristic.value getBytes:&cV

我正在Xamarin.ios平台上创建一个blutooth应用程序。我在整理来自我的应用程序连接的外围设备的数据时遇到问题。我有以下目标c代码,但我很难将其转换为c。因为我不知道如何在c#中拆分字节数组。任何关于如何从设备正确接收数据的建议。我曾想过使用封送处理类,但不确定它是否与在iOS操作系统级别上执行的操作相同

这是objective c代码,在iOS操作系统级别上运行良好

   UInt16 cValue;
  [characteristic.value getBytes:&cValue length:2];
正如您所看到的,它从Apple API调用了NSDATA类的getBytes方法,实现了这个技巧,但我在Xamarin.ios API的NSDATA类中找不到类似的东西

这就是我在C#中的想法:

这是我使用的封送处理方法


最后一件事,我不确定字节[16],因为目标c中的Uint16是8位无符号整数

首先,
UInt16
是一个16位无符号整数
byte[16]
是由8位无符号整数组成的16字节数组

您需要一个
字节[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))

UInt16是一个16位无符号整数。谢谢您的分享。可以解释你写的最后一行是如何获取值的。我是说真是太好了,我明白你刚才解释的关于比特和字节的内容了。我需要问的另一件事是,目标中是否有uint32,这相当于c#中的uint,意思是32位无符号整数。为此,如果我必须创建byteArray,我将使用byte[]bytes=new byte[4];这对我来说很有意义。但是,关于下一行,我将如何将值从字节4转换为uint。在你的回答中,正如我所说的uint16,你回答我可以使用ushort,但是uint的通信会是什么。请向我道歉-我理解内存结构有点慢。谢谢,我使用位转换器类而不是移位位?你可以,但不鼓励这样做。BitConverter从主机获取endianness。如果处理来自网络的数据,则应使用来自网络的数据的端点进行处理。虽然只要你只使用iPhone,BitConverter就可以工作,但它不是未来的证明。这同样适用于在网络结构中使用NSInteger,因为它在64位和32位手机上的范围并不相同。在这种情况下,使用手动转换和固定大小数据类型的手动方法总是更安全。
ushort value = (ushort)(bytes[0] | (bytes[1] << 8))
uint value = bytes[0] | (bytes[1] << 8) | (bytes[2] << 16) | (bytes[3] << 24);