加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl pack()发送消息?

发布时间:2020-12-16 06:25:31 所属栏目:大数据 来源:网络整理
导读:背景 我有一个设备连接到我的机器上的串行端口是面向消息的,其中每个传入的命令消息恰好是8个16位字.首先接收每??个字的最高有效字节,然后接收最低有效字节.每个标题字是命令标识符(范围从0到255).格式定义如下: XXXX Header Word (Placeholder for 16-bit
背景

我有一个设备连接到我的机器上的串行端口是面向消息的,其中每个传入的命令消息恰好是8个16位字.首先接收每??个字的最高有效字节,然后接收最低有效字节.每个标题字是命令标识符(范围从0到255).格式定义如下:

XXXX    Header Word (Placeholder for 16-bit Hexadecimal value)
XXXX    Data Word
XXXX    Data Word
XXXX    Data Word
XXXX    Data Word
XXXX    Data Word
XXXX    Data Word
XXXX    Checksum Word (Result of Exclusive OR on header word and all six data words)

我需要发送的命令的格式,标头0x5D,定义如下:

Word 1: Header = 005Dh
Word 2: Mode (values can be 2,3,6,8,9)
Words 3-7: Not significant
Word 8: 16 bit checksum

问题(全部相关)

我从其他源代码中得到了这个示例,显然正确地发送了这条消息,但我不确定发生了什么,即使在读取包上的perldoc之后也是如此.

pack("v"x8,0x00,0x5D,0x09,0x5D);

>“v”表示小端,但我找不到跟随它的x8的任何参考.
>并且根据消息的格式,0x5D值不应该在“v”x8之后,而不是在0x00之后?
>该消息应该有8个16位字,那么为什么有16而不是8?有些是0x00,而不是0x0?这有什么区别吗?

解决方法

pack“v”x8(导致包“vvvvvvvv”,可以写成包“v8”)包含8个16位数字,但是你通过了16个.

如果你已经有16个字节,你想要

pack 'C16',0x5D

但我希望你有8个16位字,所以你可以使用

pack 'n8',0x005D,0x0009,0x0000,0x005D

注意使用n而不是v来获得所需的字节顺序.

pack 'v',0x1234      => "x34x12"   Most significant byte last
pack 'n',0x1234      => "x12x34"   Most significant byte first

证明两种方法都是等价的:

my $method1 =  pack 'C16',0x5D;

my $method2 = pack 'n8',0x005D;

print($method1 eq $method2 ? "yes" : "no","n");  # yes

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读