如何转换从C++;客户端套接字到python服务器套接字

如何转换从C++;客户端套接字到python服务器套接字,python,c++,sockets,buffer,ascii,Python,C++,Sockets,Buffer,Ascii,我试图解码从人类可读形式接收的字节。如果我使用decode('utf-8')python会给出错误 utf-8'编解码器无法解码257-258位置的字节:无效的连续字节 如果我使用decode('iso-8859-1')它会显示垃圾值 ***�1234567 "PROTOCOL-ICMP Address Mask Request undefined code"¸y»_Äý

我试图解码从人类可读形式接收的字节。如果我使用
decode('utf-8')
python会给出错误

utf-8'编解码器无法解码257-258位置的字节:无效的连续字节

如果我使用
decode('iso-8859-1')
它会显示垃圾值

***�1234567 "PROTOCOL-ICMP Address Mask Request undefined code"¸y»_Äý
                                                         bb"*
                                                             )#FªPVúEÀ¨~`v¸y»_Iw
                                                                               �**
python代码:
udpUnixServer.py

#! /usr/bin/env python3

import socket
import os, os.path
import struct

if os.path.exists("snort_alert"):
  os.remove("snort_alert")

server = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM,0)

server.bind("snort_alert")

while True:
  print("listening")
  datagram,addr = server.recvfrom(1024)
  print(datagram)
  print("Unpack")
  print(struct.unpack_from('sssssssssssssssssssssssssssl', datagram, 0))
  #x=bytearray(datagram) 
  #print(x)


server.close()

os.remove("snort_alert")

print("Done")
无解码输出:

b'"PROTOCOL-ICMP Address Mask Request undefined code"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00[\x12\xbe_\x9a\xb8\n\x00b\x00\x00\x00b\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x00\x00"\x00\x00\x00*\x00\x00\x00\x00\x00\x00\x00\x00PV\xfa\x82\xe2\x00\x0c)#F\xaa\x08\x00E\x00\x00T#p@\x00@\x01\xd4\x07\xc0\xa8~\x83\x01\x02\x03\x04\x08\x00z\x1a\x00\x0c\x1b\xdc[\x12\xbe_\x00\x00\x00\x00\x7f\xb8\n\x00\x00\x00\x00\x00\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./01234567\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
我不知道如何使用
struct.pack
struct.unpack
将上述字节转换为字符串


请引导。

我刚看了一下您的结构。您的
struct Alertpkt
是65864字节,这主要是因为非常大的
uint8_t pkt[65535]数组。也只有
uint8_t alertmsg[256]中的前256个字节可能表示一个字符串(不一定是256字节长,可以更短)

在示例中,您在Python端接收到的数据(仅1024字节)

表示您得到的可读消息,您可以将其视为Python字符串。然后,
数据报[51:256]
只是填充零,您应该跳过它们

接下来的16个字节

>>> datagram[256:256+16]
b'[\x12\xbe_\x9a\xb8\n\x00b\x00\x00\x00b\x00\x00\x0
它们是:
tv\u sec
tv\u usec
caplen
pktlen
。所有这些都是4字节无符号整数,因此您可以读取它们的值,例如:

>>> ctypes.c_uint32.from_buffer_copy(datagram[256:256+4])
c_uint(1606292059)
>>> ctypes.c_uint32.from_buffer_copy(datagram[256+4:256+8])
c_uint(702618)
>>> ctypes.c_uint32.from_buffer_copy(datagram[256+8:256+12])
c_uint(98)
>>> ctypes.c_uint32.from_buffer_copy(datagram[256+12:256+16])
c_uint(98)

等等,剩下的部分数据。。。我认为这些值是合理的,因为
tv_sec
代表了“2020年11月25日星期三上午8:14:19”的时代价值。请记住,1024字节不是一个完整的结构。您可能还应该定义偏移量,或者编写一个好的解码函数,而不是直接使用幻数。

在数据报中,字符串“协议-ICMP地址掩码请求未定义代码”后面有零。您想用它们做什么?因为使用您的数据,您只需执行
str(数据[1:50])[2:-1]
即可删除尾随的零,并将其打印为人类可读的字符串,而不带“b”前缀(结果:“协议-ICMP地址掩码请求未定义代码”)。抱歉硬编码indices@pptaszni我想解码这些机器字节。很好,但在1024字节的数据中,大部分是零。您希望如何处理这些零(在ASCII中,它显然是空的)?另外,为什么你从C++套接字发送这么多零?@ PtasasZNI,我有Snort ID,它将攻击数据发送到Python套接字。以下是C++结构:CuxtAlpt8kt {Unt8}t AltReStMg[256 ];StuttPCAPUPKTHDR32 PKTH;UIT32 32 t DLTHDR;UTIT32×T NETHR;UIT32 32 t TrSHDR;UTIN 32 t数据;Unt32×t Val.;;uint32\u t gid;uint32\u t sid;uint32\u t rev;uint32\u t class\u id;uint32\u t priority;uint32\u t event\u id;uint32\u t event\u ref;struct sf\u timeval32 ref\u time;};
>>> datagram[256:256+16]
b'[\x12\xbe_\x9a\xb8\n\x00b\x00\x00\x00b\x00\x00\x0
>>> ctypes.c_uint32.from_buffer_copy(datagram[256:256+4])
c_uint(1606292059)
>>> ctypes.c_uint32.from_buffer_copy(datagram[256+4:256+8])
c_uint(702618)
>>> ctypes.c_uint32.from_buffer_copy(datagram[256+8:256+12])
c_uint(98)
>>> ctypes.c_uint32.from_buffer_copy(datagram[256+12:256+16])
c_uint(98)