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

时间:2017-03-23 01:10:50

标签: java objective-c arrays byte bluetooth-lowenergy

我正在创建一个与特定蓝牙低功耗设备通信的应用。它需要特定的握手,这对于Objective-C的{​​{1}}完全有效,但是,我在iOS

中重新创建此功能时遇到了问题

非常感谢任何想法!

工作Java代码:

Objective-C

到目前为止对于android我有以下作为等价物:

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];

如前所述,iOS效果很好,但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); 中的等效设备没有得到设备的响应,导致我认为发送的数据错误/无法识别

更新 所以,在经过充分的摔跤之后,我对进展情况有了更多的了解,我认为!'

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

以下是我所处的价值观点:

Java

可生产

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]

但是,数组中的结果值始终相同。

请帮忙!!! :)

更新2

经过一天的挖掘后,似乎虽然值记录错误,蓝牙设备感知的值应该仍然是正确的,所以我修改了这个问题并继续here

2 个答案:

答案 0 :(得分:0)

你为什么不像C

那样做

在此代码中

String handshakeString = "0x04,0x08,0x0F,0x66,0x99,0x41,0x52,0x43,0x55,0xAA";
byte[] value = handshakeString.getBytes();

这只是制作一个文本字符串,其中第一个字符为0,第二个字符为x

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

修改

你可能需要重新考虑像0x99这样的值,就像在java中一样,字节值是按照javadocs

  

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

请参阅Can we make unsigned byte in Java

答案 1 :(得分:0)

String handshakeString = "0x04,0x08,0x0F,0x66,0x99,0x41,0x52,0x43,0x55,0xAA";
byte[] value = handshakeString.getBytes();

还会考虑,,因此会创建很多bytes,并且不会在您的c代码中创建相同的byte AS。

尝试直接使用byte[]

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