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
foriOS
中都能完美工作,但是,我在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};