我有一个由java编写的套接字服务器(使用netty),我使用LengthFieldBasedFrameDecoder来解码消息;编码器,如果使用java应该 是:
{{1}}
但现在我需要一个由python编写的套接字客户端,那么如何将消息长度(8字节,长类型)写入缓冲区
答案 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]
或者你可以编写一个显式循环,将它组合成一个像上面这样的整数。