有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我正在制作一个与特定的蓝牙低能设备通信的应用程序。它需要一个特定的握手,而这一切在Objective-Cfor 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


共 (2) 个答案

  1. # 1 楼答案

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

    也会计算,,因此会创建更多的bytes,并且不会得到与c代码中相同的byte

    试着直接使用byte[]

    byte[] value=new byte[]{0x04,0x08,0x0F,0x66,0x99,0x41,0x52,0x43,0x55,0xAA};
    
  2. # 2 楼答案

    你为什么不按照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一致

    It has a minimum value of -128 and a maximum value of 127 (inclusive).

    Can we make unsigned byte in Java