python - 是什么导致将空值插入到我的字节数组中?

标签 python msmq python-bytearray

我正在尝试使用 MSMQ 将 NMEA 消息发送到 C# 服务器。该 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()

我的问题是:这些空值从何而来?它们是由字节数组创建中的错误引起的还是我分派(dispatch)到 MSMQ 的方法出错了?

我已经尝试了很多 bytearray() 的变体。上面的代码可以追溯到我不太“极端”的尝试之一。任何见解都值得赞赏。

这个问题可以通过在对我的消息进行排队的 exe 上使用 subprocess.Popen() 来解决,但是如果有一个仅使用 Python 的解决方案那就太好了。

最佳答案

散布一些 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 两次。消息初始化看起来很正常。 qinfo 电话看起来很正常。您可能想检查语法是否为 msg.Send(queue) (可能是queue.Send(msg)?)。

这些看起来很合理,

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

这些线路看起来很安全,

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

我会仔细看看这些(首先),

queue = qinfo.Open(2, 0)
msg.Send(queue)
queue.Close()

关于python - 是什么导致将空值插入到我的字节数组中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44210089/

相关文章:

python - 如何设置 keras 自定义指标仅在纪元结束时调用?

python - 尝试使用 Python/pandas 根据另一个数据帧的列的内部总和创建新的数据帧

python - 如何优化这个MapReduce函数,Python,mrjob

Python:无论是否分配输出,我都可以更改函数行为吗?

wcf - Tibco EMS 与 MSMQ 与 MQ

c# - 读取 MSMQ 事务性死信队列

.net - 如何在 .NET 中从 Websphere MQ 获取事务?

python - 替换字节数组中的字节以修复编码

python - 如何优化二进制文件操作?