1

我想将 C++ 中的这一特定代码部分转换为 python 但是我在 python 中执行 memset 和 sprintf 之类的操作时被卡住了。谁能帮我在python中做同样的事情。我的代码如下。

send(char* data)
{
/** COnvert From here **/
packetLength=strlen(data);
dataBuffer = new char[packetLength];
memset(dataBuffer, 0x00, packetLength);

char headerInfo[32];
memset(headerInfo, 0x00, sizeof (headerInfo));
sprintf(headerInfo, "%d", packetLength);

memcpy(dataBuffer, headerInfo, 32);
memcpy(dataBuffer + 32, data, packetLength);
/** Upto Here **/
//TODO send data via socket
}

这些我尝试过的东西

#headerInfo=bytearray()
                #headerInfo.insert(0,transactionId)
                #headerInfo.insert(self.headerParameterLength,(self.headerLength+len(xmlPacket)))
                #headerInfo=(('%16d'%transactionId).zfill(16))+(('%d'%(self.headerLength+len(xmlPacket))).zfill(16))
                #print("Sending packet for transaction "+(('%d'%transactionId).zfill(16))+" packetLength "+(('%d'%(self.headerLength+len(xmlPacket))).zfill(16)))
                #dataPacket=headerInfo+xmlPacket
                headerInfo=('%0x0016d'%transactionId)+('%0x00d'%(self.headerLength+len(xmlPacket)))
4

1 回答 1

4

sprintf在 Python 中是通过使用%or来实现的.format,例如:

headerInfo = '%d' % packetLength
# or,
headerInfo = '{0:d}'.format(packetLength)
# or even
headerInfo = str(packetLength)

类似memset的操作可以通过乘法来完成,例如:

headerInfo = '\0' * 32

但是,这些不会像您期望的那样运行,因为字符串是不可变的。您需要执行以下操作:

headerInfo = str(packetLength)
headerInfo += '\0' * (32 - len(headerInfo)) # pad the string
dataBuffer = headerInfo + data

或者使用struct模块:

import struct
dataBuffer = struct.pack('32ss', str(packetLength), data)

32s格式字符串将左对齐字符串并用 NUL 字符填充。)


如果您使用的是 Python 3,那么您必须小心字节与字符串。如果您正在处理网络套接字等,您要确保一切都是字节,而不是 unicode 字符串。

于 2012-07-04T06:59:48.373 回答