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

sprintfPython では、 %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 に答える