Perl:如何让unpack自动处理字节数不均,将单字节视为空填充短整型?
当然有更简洁的办法,不用手动检查长度补位,直接靠unpack的模板就能搞定!
试试这个写法:
my $input = 'abcde'; foreach (unpack '(S|C)*', $input) { print "$_ "; }
执行后正好输出你想要的结果:25185 25699 101
这个模板的工作逻辑
(S|C)*是一个重复匹配的分组:
- Perl会优先用
S(2字节的短整型)去解析输入字节,把每两个字节打包成一个短整型值; - 当剩下的字节不足2个时,就自动切换到
C(1字节的无符号字符)去解析最后一个字节,直接返回该字节的ASCII码值——也就是你期望的101。
不管输入字符串的长度是奇数还是偶数,这个模板都能完美处理:偶数长度时全部按S解析,奇数长度时最后一个字节用C兜底。
额外补充
如果你执着于要把最后一个字节当成“补空的短整型”(也就是严格的16位值,高字节补0),也可以用补字节的方式,但要注意字节序的问题:
# 仅当长度为奇数时补一个空字节 my $adjusted = $input . (length($input) % 2 ? "\x00" : ""); foreach (unpack 'S*', $adjusted) { print "$_ "; }
不过这里要注意,S是主机字节序,如果你的系统是大端序,e\x00会被解析成25856(0x6500),和你的期望不符。所以相比之下,(S|C)*的方式更稳妥,结果也完全符合你的需求。
内容的提问来源于stack exchange,提问作者DanielElgh
相关产品推荐
相关产品推荐

