objective c Java将字符串十六进制值转换为字节[],重新创建此objc功能
我正在制作一个与特定的蓝牙低能设备通信的应用程序。它需要一个特定的握手,而这一切在Objective-C
for iOS
中都能很好地工作,但是,我在Java
中重新创建此功能时遇到了困难
任何想法都非常感谢
工作Objective-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];
到目前为止,对于安卓,我有以下等效项:
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
经过一天的挖掘,虽然值记录不正确,但蓝牙设备感知到的值应该仍然是正确的,因此我修改了这个问题,并继续here
# 1 楼答案
也会计算
,
,因此会创建更多的bytes
,并且不会得到与c代码中相同的byte
试着直接使用
byte[]
# 2 楼答案
你为什么不按照C的方式来做呢
在这段代码中
这只是生成一个文本字符串,其中第一个字符是
0
,第二个字符是x
等等试试看
编辑
您可能需要重新考虑
0x99
等值,因为在java中,字节值与javadocs一致见Can we make unsigned byte in Java