gpt4 book ai didi

perl - 如何解析在 Perl 中解压缩的以空格分隔的 STDIN 十六进制字符串?

转载 作者:行者123 更新时间:2023-12-04 13:55:37 25 4
gpt4 key购买 nike

我有一个 Java 程序,它以空格分隔的十六进制格式输出通过网络接收的 16 字节的原始数据包。由于我不想更改该代码,因此我将结果传送到 Perl 脚本,理论上,该脚本可以简单地 unpack这来自 STDIN成可识别的变量。以下是我的 Perl 文件的行输入示例:

FF FF 09 7D 10 01 07 01 00 02 00 1D 00 00 00 00 00 06 00 07 00
|--垃圾-----|c--|c--|int---|int---|int---|int---|int---|int---|int- --|

(c 代表字符/字节,int 代表 16 位整数变量)

我最初想使用 unpack将每个输入行干净地分成我需要的变量。但是,由于字符串中的空格分隔,我不知道如何处理它(我可以使用 'A' 作为模板,但我不妨只使用 split!)

有没有一种优雅的使用方式 unpack() ?我不是 Perl 高手,但另一种方法是,正如我之前建议的那样,使用 split然后手动将每个十六进制转换为一个字节,然后使用位操作和掩码来获得我想要的。任何其他建议(如果 unpack 不能挽救这一天)?

最佳答案

假设这些整数是大端顺序,使用

#! /usr/bin/perl

use warnings;
use strict;

# for demo only
*ARGV = *DATA;

while (<>) {
my @fields = unpack "x5C2n7",
pack "C*",
map hex, split;

print "[", join("][" => @fields), "]\n";
}

__DATA__
FF FF 09 7D 10 01 07 01 00 02 00 1D 00 00 00 00 00 06 00 07 00

它首先根据它们的值打包字节( C* )。 unpack模板有以下几个部分:
  • x5跳过五个字节
  • C2解码两个 unsigned char
  • n7解码七个 16 位大端无符号整数

  • 输出:

    $ ./dump-packets
    [1][7][256][512][7424][0][0][1536][1792]

    关于perl - 如何解析在 Perl 中解压缩的以空格分隔的 STDIN 十六进制字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2180390/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com