如何将long类型写入bytesarray

时间:2017-10-23 04:18:52

标签: java python netty

我有一个由java编写的套接字服务器(使用netty),我使用LengthFieldBasedFrameDecoder来解码消息;编码器,如果使用java应该 是:

{{1}}

但现在我需要一个由python编写的套接字客户端,那么如何将消息长度(8字节,长类型)写入缓冲区

2 个答案:

答案 0 :(得分:0)

你基本上需要按位移位。我不是python程序员,所以我不确定python语法,但基本上这是它在java中实现的方式:

static void setLong(byte[] memory, int index, long value) {
    memory[index]     = (byte) (value >>> 56);
    memory[index + 1] = (byte) (value >>> 48);
    memory[index + 2] = (byte) (value >>> 40);
    memory[index + 3] = (byte) (value >>> 32);
    memory[index + 4] = (byte) (value >>> 24);
    memory[index + 5] = (byte) (value >>> 16);
    memory[index + 6] = (byte) (value >>> 8);
    memory[index + 7] = (byte) value;
}

所以在python中做同样的转换,你应该没问题。顺便说一句,这是BIG_ENDIAN编码。

答案 1 :(得分:0)

套接字客户端允许您逐字节读取。

读取8个字节,得到一个字节串:

bytes_sequence = client_socket.read(8)

请注意,bytes_sequence的每个元素都是"字符",因此您需要使用ord()来获取其数值。

如果需要,现在将其转换为8字节long

对于大端数据("网络订单"),您可以

def from_big_endian(bytes_sequence):
  result = 0
  for b in bytes_sequence:
    result = result << 8 + ord(b)  # ord() converts b to integer.
  return result

或者,更短:reduce(lambda acc, v: (acc << 8) + ord(v), bytes_sequence, 0)

对于小端序列,您可以例如反转字节序列,并将其作为big-endian序列处理:

big_endian_seq = little_endian_seq[::-1]

或者你可以编写一个显式循环,将它组合成一个像上面这样的整数。