如何将python struct.unpack转换为java

时间:2015-04-26 14:38:34

标签: java python struct byte unpack

我正在尝试为python' s

找到java等价物
struct.unpack('hccccc',raw)

https://docs.python.org/2/library/struct.html

我怎样才能以干净的方式做到这一点?

4 个答案:

答案 0 :(得分:1)

这就是我处理这个问题的方法,我不认为/知道它是否是最好的方法,但经过多次搜索后我自己做了,我可能会做一个实际的,完整的/干净的api 。 如果我这样做,我会在这里发布

x代表忽略

c for char

s for string

b表示字节

import java.nio.*;

public class struct{
    public static String[] unpack(char[] packet, byte[] raw){
        String[] result = new String[packet.length];

        int pos = 0;
        int Strindex = 0;

        for (int x = 0; x < packet.length; x++){

            char type = packet[x];
            if (type == 'x'){
                pos += 1;
                continue;
            }
            else if (type == 'c'){
                char c = (char) (raw[pos] & 0xFF);
                result[Strindex] = Character.toString(c);
                Strindex += 1;
                pos += 1;
            }
            else if (type == 'h'){
                ByteBuffer bb = ByteBuffer.allocate(2);
                bb.order(ByteOrder.LITTLE_ENDIAN);
                bb.put(raw[pos]);
                bb.put(raw[pos+1]);
                short shortVal = bb.getShort(0);
                result[Strindex] = Short.toString(shortVal);
                pos += 2;
                Strindex += 1;
            }
            else if (type == 's'){
                String s = "";

                while (raw[pos] != (byte)0x00){
                    char c = (char) (raw[pos] & 0xFF);
                    s += Character.toString(c);
                    pos += 1;
                }
                result[Strindex] = s;
                Strindex += 1;
                pos += 1;
            }
            else if (type == 'b'){
                Byte p = raw[pos];
                result[Strindex] = Integer.toString(p.intValue());
                Strindex += 1;
                pos += 1;
            }
        }
        return result;
    }
}

答案 1 :(得分:0)

这种操作在Java中称为“序列化”。 有关教程,请参阅http://www.tutorialspoint.com/java/java_serialization.htm。由于序列化使用字节而不是字符,因此您可能希望之后对这些字节进行编码以获得可打印的字符串。

答案 2 :(得分:0)

JBBP library可以帮助

byte [] data = new byte [] {1,2,3,4,5,6,7,8};
JBBPFieldStruct parsed = JBBPParser.prepare("short; ubyte [5];").parse(new ByteArrayInputStream(data));
System.out.println("short = "+parsed.findFieldForType(JBBPFieldShort.class).getAsInt());
System.out.println("array = "+Arrays.toString(parsed.findFieldForType(JBBPFieldArrayUByte.class).getArray()));

答案 3 :(得分:0)

今天,当我调整杂音分割哈希函数时,我坚持执行类似的任务。因此可能对某人有用。 对于struct.unpack('q', msg)[0],可以使用ByteBuffer.wrap(msg.getBytes()).order(ByteOrder.LITTLE_ENDIAN).getLong();,因为C ++中“ q”是'long long',其大小为-(1 << 63)至(1 << 63)-1(-9,223,372,036,854,775,808到9,223,372,036,854,775,807) 8个字节),在Java中等于“长”(8个字节),还具有“ -9,223,372,036,854,775,808到9,223,372,036,854,775,807”。