0

我正在尝试在 python 中创建一个带有格式的查询,我不知道如何对数据的二进制输入进行字符串转义。它返回如下内容:

插入到python. UDP( Packet, Destination, Source, Protocol, Version, Header_Length, TTL, Protoco l_UDP, Target, Source_Port, Destination_Port, Length) 值 (NULL, '00:0C:29:B2:14:0C', '192.168.178.50', '8', '4', '20', ' 128'、'17'、'192.168.178.24'、'52371'、'8888'、'29227'、'b'数据\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ x00\x00\x00\x00'');)

如何使用 python 中的格式正确转义二进制字符串值?

def setopUDP(destination, source, protocol, version, header_length, ttl, protocolEGP, target, source_port, destination_port, length, data):
query = ("INSERT INTO `python`.`UDP` (`Packet`, `Destination`, `Source`, `Protocol`, "
         "`Version`, `Header_Length`, `TTL`, `Protocol_UDP`, `Target`, `Source_Port`, "
         "`Destination_Port`, `Length`) VALUES (NULL, '{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}');)"
         .format(destination, source, protocol, version, header_length, ttl, protocolEGP, target, source_port, destination_port, length, data))


setopCON(query)  
4

2 回答 2

8

以防万一有人搜索了这个主题并被引导到这里

这就是您为“格式”转义的方式:

>>> "{{}}{}".format(10)
'{}10'

所以,{{}}被转义并简化为{}

于 2013-10-27T16:37:53.543 回答
2

不要对 SQL 查询使用格式。请改用SQL 参数。

然后,您的数据库适配器会为您处理转义,前提是它可以处理二进制数据。

格式化 SQL 参数的具体方式取决于所使用的数据库;sqlite3 使用?占位符:

query = ("INSERT INTO `python`.`UDP` (`Packet`, `Destination`, `Source`, `Protocol`, "
         "`Version`, `Header_Length`, `TTL`, `Protocol_UDP`, `Target`, `Source_Port`, "
         "`Destination_Port`, `Length`) VALUES (NULL, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?))")

并且您将值列表作为cursor.execute()方法的第二个参数传递:

cursor.execute(query,
    (destination, source, protocol, version, header_length, ttl, protocolEGP, target, source_port, destination_port, length, data))

您需要在数据库适配器文档中验证支持哪种SQL 参数样式(一个或多个?%s:1或)以及它如何处理二进制值。:name%(name)s

如果根本不处理二进制值,则需要将该二进制值解码为 un​​icode 值;也许使用 base64 编码,或者从 Latin-1 解码以一对一地转换为 Unicode 代码点。

于 2013-10-27T10:37:02.157 回答