Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Perl脚本将little-Endian转换为Big-Endian?_Perl_Endianness - Fatal编程技术网

如何使用Perl脚本将little-Endian转换为Big-Endian?

如何使用Perl脚本将little-Endian转换为Big-Endian?,perl,endianness,Perl,Endianness,我正在使用PerlWin32::SerialPort模块。在这个特殊模块中,我使用输入命令发送数据。我发送给嵌入式系统的数据是使用transmit\u char函数的标量数据(数字)(如果它是C,它将是整数,但由于它是一种脚本语言,我不确定perl的内部格式是什么。我猜perl总是将所有数字存储为32位浮点,在传输时由模块调整) 然后,在发送数据之后,我使用input命令接收数据。我接收的数据可能是二进制格式的,但perl不知道如何解释它。我像这样使用unpack函数 my $binData =

我正在使用Perl
Win32::SerialPort
模块。在这个特殊模块中,我使用输入命令发送数据。我发送给嵌入式系统的数据是使用
transmit\u char
函数的标量数据(数字)(如果它是C,它将是整数,但由于它是一种脚本语言,我不确定perl的内部格式是什么。我猜perl总是将所有数字存储为32位浮点,在传输时由模块调整)

然后,在发送数据之后,我使用input命令接收数据。我接收的数据可能是二进制格式的,但perl不知道如何解释它。我像这样使用
unpack
函数

my $binData = $PortObj->input;
my $hexData = unpack("H*",$binData);
假设我通过串行电缆传输
0x4294
,这是我正在与之通信的嵌入式系统上的一个命令,我期望得到
0x5245
的响应。现在的问题是端性:当我解包时,我得到了
0x4552
,这是错误的。有没有办法通过调整二进制数据来纠正这一点。我还需要ed
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 );
请参阅。请注意“
”修饰符,用于控制指令的尾数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”使用>和您的问题没有意义。大尾端和小尾端适用于字/双字/四字等,而不是字节。字节总是以相同的方式存储……您需要告诉我们二进制数据代表什么(二进制字、双字、四字等)发布带有示例输入的完整示例程序以获得最佳帮助。Perl朋友们,我试图从匿名编辑中挽救一些内容。但是,我不知道这是否有意义。因此,请重新查看并根据需要更正。