我想将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)))
答案 0 :(得分:4)
sprintf
是使用%
或.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字符串。