2017-05-26 4 views
1

MSMQを使用してC#サーバーにNMEAメッセージを送信しようとしています。このNMEAメッセージ(文字列)は、base64でエンコードされ、バイト配列として送信されます。バイト配列にヌル値を挿入する原因は何ですか?

私はに実行している問題は、MSMQで私のバイト配列として表示されていることである。

03 00 00 00 00 00 00 00 ........ 
3C 00 00 00 00 00 00 00 <....... 
01 00 00 00 00 00 00 00 ........ 
03 00 00 00 00 00 00 00 ........ 
3F 00 00 00 00 00 00 00 ?....... 
01 00 00 00 00 00 00 00 ........ 
03 00 00 00 00 00 00 00 ........ 
78 00 00 00 00 00 00 00 x....... 

は私が探しているものに反対する:

3C 3F 78 6D 6C 20 76 65 <?xml ve 
72 73 69 6F 6E 3D 22 31 rsion="1 
2E 30 22 3F 3E 0D 0A 3C .0"?>..< 
62 61 73 65 36 34 42 69 base64Bi 

私のコードのサンプルを:

# base64 encode the message 
b64_nmea = base64.b64encode(nmea) 

# Adding xml prolog.. used by the server 
b64_nmea = '<?xml version="1.0"?>..<base64Binary>' + b64_nmea + '==</base64Binary>' 

# creates a byte array from b64_nmea 
bytearray_nmea = bytearray(b64_nmea) 

# Then to send the message: 
qinfo = win32com.client.Dispatch("MSMQ.MSMQQueueInfo") 
computer_name = os.getenv('COMPUTERNAME') 
qinfo.FormatName = "direct=os:" + computer_name + "\\Private$\\test" 
queue = qinfo.Open(2, 0) 
msg = win32com.client.Dispatch("MSMQ.MSMQMessage") 
msg.Label = "test" 
msg.Body = bytearray_nmea 
msg.Send(queue) 
queue.Close() 

私の質問は:これらのNULL値は来るのかバイト配列の作成時にエラーが発生したか、またはMSMQへのディスパッチのための私のメソッドがウォンキーになっていますか?

私はbytearray()でかなりのバリエーションを試しました。上記のコードは、あまり「極端な」試みに戻っています。どんな洞察にも感謝します。

この問題は、メッセージをキューに入れるexeでsubprocess.Popen()を使用することで解決できますが、Pythonのみを使用したソリューションを用意することは素晴らしいことです。

+0

、私は(最初の)これらをよく見ます

qinfo.FormatName = "direct=os:" + computer_name + "\\Private$\\test" msg.Label = "test" msg.Body = bytearray_nmea 

qinfo = win32com.client.Dispatch("MSMQ.MSMQQueueInfo") msg = win32com.client.Dispatch("MSMQ.MSMQMessage") 

これらの行は安全なようで、合理的なようですそのような 'nmea'変数です。異なる変数を使用し、意味のある名前を付けてください。 – Barmar

+0

うまくいけば、これはもう少し明確です。 – Infoblack

+0

私は実際の問題を手伝うことができればと願っています。 – Barmar

答えて

1

いくつかのprint文を振って、Pythonが何をしているのか観察してください。

これらが正常に動作し、

import base64 
nmea="hello, world" 
print len(nmea) 
b64_nmea = base64.b64encode(nmea) 
print len(b64_nmea) 
print b64_nmea 
b64_nmea = '<?xml version="1.0"?>..<base64Binary>' + b64_nmea + '==</base64Binary>' 
print len(b64_nmea) 
print b64_nmea 
print bytearray(b64_nmea) 

あなたの問題は

#send the message: 
computer_name = os.getenv('COMPUTERNAME') 

あなたは異なるMSMQインスタンスで、二回win32com.client.Dispatchを呼び出し、以下のどこかにあります。 msgの初期化は正常に見えます。 qinfo呼び出しは正気ではないようです。構文がmsg.Send(queue)(queue.Send(msg)?)である可能性があります。

これらはあなたが再利用し続けるとき、それは本当に紛らわしいです

queue = qinfo.Open(2, 0) 
msg.Send(queue) 
queue.Close() 
関連する問題