如何使用Perl脚本将little-Endian转换为Big-Endian?
我正在使用Perl如何使用Perl脚本将little-Endian转换为Big-Endian?,perl,endianness,Perl,Endianness,我正在使用PerlWin32::SerialPort模块。在这个特殊模块中,我使用输入命令发送数据。我发送给嵌入式系统的数据是使用transmit\u char函数的标量数据(数字)(如果它是C,它将是整数,但由于它是一种脚本语言,我不确定perl的内部格式是什么。我猜perl总是将所有数字存储为32位浮点,在传输时由模块调整) 然后,在发送数据之后,我使用input命令接收数据。我接收的数据可能是二进制格式的,但perl不知道如何解释它。我像这样使用unpack函数 my $binData =
Win32::SerialPort
模块。在这个特殊模块中,我使用输入命令发送数据。我发送给嵌入式系统的数据是使用transmit\u char
函数的标量数据(数字)(如果它是C,它将是整数,但由于它是一种脚本语言,我不确定perl的内部格式是什么。我猜perl总是将所有数字存储为32位浮点,在传输时由模块调整)
然后,在发送数据之后,我使用input命令接收数据。我接收的数据可能是二进制格式的,但perl不知道如何解释它。我像这样使用unpack
函数
my $binData = $PortObj->input;
my $hexData = unpack("H*",$binData);
假设我通过串行电缆传输0x4294
,这是我正在与之通信的嵌入式系统上的一个命令,我期望得到0x5245
的响应。现在的问题是端性:当我解包时,我得到了0x4552
,这是错误的。有没有办法通过调整二进制数据来纠正这一点。我还需要edh*
,这给了我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 );
请参阅。请注意“
”修饰符,用于控制指令的尾数where,其中默认尾数不是您想要的尾数
注意:如果您正在从文件中读取,您已经有字节。请不要使用pack'H*'
创建字节
注意:如果您正在读取该文件,请不要忘记使用句柄
关于OP在其帖子中添加的示例:
要从
“\x45\x52”
中获取0x5245
,请使用unpack(“v”,两个字节)
这些数据类型是什么?Perl的包中有N
和v
整数格式说明符,Perl 5.10添加了
和
代码修饰符,这样您就可以读取短、浮和双精度(和一些其他类型)在您想要的结尾。/p
p通过这些,您可以读取输入中使用的endianness中的数据。执行此操作后,您可以在内部表示数据,并且可以根据需要重新打包。/p
pI在a href=”中写下这一点https://www.effectiveperlprogramming.com/2011/03/use-the-and-pack-modifiers-to-specify-the-architecture/“rel=“nofollow noreferrer”使用>和