2012-03-22 9 views
0

私は現在、PythonでRDPクライアントを構築しようとしています。私はlenチェックで次の問題を発見しました。python len計算

から:http://msdn.microsoft.com/en-us/library/cc240836%28v=prot.10%29.aspx

81 2a -> ConnectData::connectPDU length = 298 bytes Since the most significant bit of the first byte (0x81) is set to 1 and the following bit is set to 0, the length is given by the low six bits of the first byte and the second byte. Hence, the value is 0x12a, which is 298 bytes.

これは奇妙に聞こえます。通常のlenのチェックのために

、私は単純に使用しています:struct.pack(">h",len(str(PacketLen)))

が、この場合には、私は本当に上記のように、私がlenを計算することができますどのように表示されませんが。

これについてのお手伝いをさせていただきますようお願い申し上げます。

答えて

1

ただ、ビットごとのOR使って、最上位ビットを設定します。あなたはすなわち、それは2 ** 14未満で、必ず長さが14ビットに収まるようにするチェックを追加したい場合があります

struct.pack(">H", len(...) | 0x8000) 

を。

:TokenMacGuyによるコメントに従って修正されました。

+0

ありがとう! 私はまだエラーが発生しています: struct.error: 'h'フォーマットには-32768 <= number <= 32767が必要です 何が良いのでしょうか? – n00bz0r

+1

'h'が署名型であるため、あなたはおそらく署名されていないバージョン、' H'を望みます。 – SingleNegationElimination

+0

伝説、ありがとう! – n00bz0r

0

帯域幅に敏感な伝送プロトコルを扱う際に、まれなシナリオはありません。彼らは基本的には、0〜> 0x7Fの範囲に収まる長さが1バイトを使用するかどうかを指定しています。そうでない場合は、オプションで2バイトを使用できます。 (注意:このシステムの最大の正当な値は、したがって、16,383である)

は、ここでは簡単な例です。そのため

if len <= 0x7F: 
    pkt = struct.pack('B', len) 
elif len <= 0x3FFF: 
    pkt = struct.pack('>h', len | 0x8000) 
else: 
    raise ValueError('length exceeds maxvalue')