Python sprintf和memset操作

时间:2012-07-04 06:50:13

标签: c++ python network-programming

我想将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)))

1 个答案:

答案 0 :(得分:4)

Python中的

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字符串。