我正在使用Perl Win32::SerialPort模块.在这个特殊模块中,我使用输入命令发送数据.我发送到嵌入式系统的数据是使用该transmit_char函数的标量数据(数字)(如果它是C它将是整数,但由于它是一种脚本语言,我不知道perl中的内部格式是什么.我的猜测是perl总是将所有数字存储为32位浮点,这些浮点在发送时由模块调整).
然后在发送数据后,我使用输入命令接收数据.我收到的数据可能是二进制形式,但perl不知道如何解释它.我使用这样的unpack功能
my $binData = $PortObj->input;
my $hexData = unpack("H*",$binData);
Run Code Online (Sandbox Code Playgroud)
假设我0x4294通过串行电缆传输,这是我正在与之通信的嵌入式系统上的一个命令,我希望得到一个响应 0x5245.现在问题在于endianess:当我解压缩时,我得到了0x4552,这是错误的.有没有办法通过调整二进制数据来纠正它.我也试过h*,这给了我0x5425,这也是不对的.
注意:我收到的数据一次通过字节发送,LSB首先发送
Endianess适用于整数(主要)字节的排序.您需要知道整数的大小.
32位无符号示例:
my $bytes = pack('H*', '1122334455667788');
my @n = unpack('N*', $bytes);
# @n = ( 0x11223344, 0x55667788 );
my $bytes = pack('H*', '4433221188776655');
my @n = unpack('V*', $bytes);
# @n = ( 0x11223344, 0x55667788 );
Run Code Online (Sandbox Code Playgroud)
见pack.请注意" <"和" >"修饰符来控制endianess,其中默认endianess不是您想要的指令.
注意:如果您正在读取文件,那么您已经有了字节.不要使用创建字节pack 'H*'.
注意:如果您正在读取文件,请不要忘记binmode句柄.
关于OP的例子,OP加入了他的帖子:
要获得0x5245从"\x45\x52",使用unpack("v", $two_bytes).