Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.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
Java将字符串十六进制值转换为字节[],重新创建此obj-c功能_Java_Objective C_Arrays_Byte_Bluetooth Lowenergy - Fatal编程技术网

Java将字符串十六进制值转换为字节[],重新创建此obj-c功能

Java将字符串十六进制值转换为字节[],重新创建此obj-c功能,java,objective-c,arrays,byte,bluetooth-lowenergy,Java,Objective C,Arrays,Byte,Bluetooth Lowenergy,我正在制作一个与特定的蓝牙低能设备通信的应用程序。它需要一次特定的握手,而这一切在Objective-CforiOS中都能完美工作,但是,我在Java中重新创建此功能时遇到了困难 任何想法都非常感谢 工作目标-C代码: uint8_t bytes[] = {0x04,0x08,0x0F,0x66,0x99,0x41,0x52,0x43,0x55,0xAA}; NSData *data = [NSData dataWithBytes:bytes length:sizeof(bytes)]; [_b

我正在制作一个与特定的蓝牙低能设备通信的应用程序。它需要一次特定的握手,而这一切在
Objective-C
for
iOS
中都能完美工作,但是,我在
Java
中重新创建此功能时遇到了困难

任何想法都非常感谢

工作
目标-C
代码:

uint8_t bytes[] = {0x04,0x08,0x0F,0x66,0x99,0x41,0x52,0x43,0x55,0xAA};
NSData *data = [NSData dataWithBytes:bytes length:sizeof(bytes)];
[_btDevice writeValue:data forCharacteristic:_dataCommsCharacteristic type:CBCharacteristicWriteWithResponse];
到目前为止,对于android,我有以下等效项:

byte[] handshake = {0x04,0x08,0x0F,0x66,(byte)0x99,0x41,0x52,0x43,0x55,(byte)0xAA};

characteristic.setValue(handshake);
boolean writeStatus = gatt.writeCharacteristic(characteristic);
Log.d(TAG,"Handshake sent: " + writeStatus);
如前所述,iOS工作得很好,但是
Java
中的等效功能是没有收到设备的响应,这让我认为发送的数据是错误的/无法识别的

更新 所以,在与此进行了大量的斗争之后,我对正在发生的事情有了更多的了解

正如下面提到的,int的最大值是127,所以0x99和0xAA数组中的2个值当然超出了这个范围

以下是我的价值观:

byte bytes[] = {0x04,0x08,0x0F,0x66,(byte)0x99,0x41,0x52,0x43,0x55,(byte)0xAA};
Log.d(TAG, Arrays.toString(bytes));
产生

[4, 8, 15, 102, -103, 65, 82, 67, 85, -86]
但是,需要确定预期值

[4, 8, 15, 102, 153, 65, 82, 67, 85, 170]
我已尝试隐式转换这些麻烦的字节,并尝试了以下操作:

byte bytes[] = {0x04,0x08,0x0F,0x66,(byte)(0x99 & 0xFF),0x41,0x52,0x43,0x55,(byte)(0xAA & 0xFF)};
但是,数组中的结果值始终相同

请帮忙!!!:)

更新2


经过一天的挖掘,虽然值记录不正确,但蓝牙设备感知到的值应该仍然是正确的,因此我修改了这个问题,并继续讨论

为什么您不使用与C相同的方法

在此代码中

String handshakeString = "0x04,0x08,0x0F,0x66,0x99,0x41,0x52,0x43,0x55,0xAA";
byte[] value = handshakeString.getBytes();
这只是生成一个文本字符串,其中第一个字符是
0
,第二个字符是
x
等等

试一试

编辑

您可能需要重新考虑值,例如
0x99
,因为在java中,字节值与javadocs一致

它的最小值为-128,最大值为127(含)

还将计算
,从而创建大量的
字节
,并且不会产生与c代码中相同的
字节

尝试直接使用
字节[]

byte[] value=new byte[]{0x04,0x08,0x0F,0x66,0x99,0x41,0x52,0x43,0x55,0xAA};

你能详细解释一下新的代码在做什么,以及它在哪里没有像你期望的那样工作吗?谢谢你的建议,我尝试了你的建议,但是得到了一个编译错误,从int到byte的有损转换。我尝试将每个项目转换为字节(这似乎是错误的)编译很好,但设备仍然无法识别该命令。不幸的是,硬件制造商将所需的命令指定为0x66、0x99、0x41、0x52、0x43、0x55、0xaa字符串,因此我无法更改0x99元素。您是否根据链接中的建议尝试使用短数组?我刚刚尝试了很不幸,短数组似乎没有什么不同。嗯,根据我们的说法,没有什么可以阻止你对字节
字节arr[]进行短播,{0x04,0x08,0x0F,0x66,(byte)0x99,0x41,0x52,0x43,0x55,(byte)0xAA}嗯,是的,那是有道理的。我在上面的原始帖子中添加了一个更新,不幸的是,我离解决这个问题还差得远。
String handshakeString = "0x04,0x08,0x0F,0x66,0x99,0x41,0x52,0x43,0x55,0xAA";
byte[] value = handshakeString.getBytes();
byte[] value=new byte[]{0x04,0x08,0x0F,0x66,0x99,0x41,0x52,0x43,0x55,0xAA};