将python的struct.unpack代码转换为java

时间:2016-05-20 14:06:01

标签: java python

我正在尝试将 Beuerer BF480 设备与java程序集成。我找到了python代码,它以所需的格式通过串行USB接口转换接收的数据。下面是在python中完成工作的代码片段:

frmt = "!" + "H"*64
x = struct.unpack(frmt, byte_array)

有人可以帮助我理解这两行代码吗?如果有人知道java相当于此,那就很高兴知道。

1 个答案:

答案 0 :(得分:0)

我不想回答我自己的问题。

但是,正如我现在所说的那样,我想分享这个问题的解决方案。基本上python代码试图将字节数组转换为十六进制值。表达式"!" + "H"*64告诉它BIG_ENDIAN表达式(从左边开始读取字节数组)并将字节数组转换为64个十六进制值。

我没有找到java中的等效代码来完成这项工作,但是在努力解码字节数组后,我能够使用下面的代码获得预期的结果。

public static int[] unpack(final byte[] byte_array) {
    final int[] integerReadings = new int[byte_array.length / 2];
    for(int counter = 0, integerCounter = 0; counter < byte_array.length;) {
        integerReadings[integerCounter] = convertTwoBytesToInteger(byte_array[counter], byte_array[counter + 1]);
        counter += 2;
        integerCounter++;
    }
    return integerReadings;
}

private static int convertTwoBytesToInteger(final byte byte1, final byte byte2) {
    final int unsignedInteger1 = getUnsignedInteger(byte1);
    final int unsignedInteger2 = getUnsignedInteger(byte2);
    return unsignedInteger1 * 256 + unsignedInteger2;
}

private static int getUnsignedInteger(final byte b) {
    int unsignedInteger = b;
    if(b < 0) {
        unsignedInteger = b + 256;
    }
    return unsignedInteger;
}

此代码是关于数据流的字节级操作。但是,它解决了我现在的问题,我得到了预期的结果。如果有一个更好的解决方案,我肯定希望实现相同的。