代码之家  ›  专栏  ›  技术社区  ›  4zap

读取探测值后的Perl字节扫描[已关闭]

  •  -2
  • 4zap  · 技术社区  · 8 年前

    我需要Perl方面的帮助。也许对你来说,一个简单的问题可以回答。。。 从AD转换器中,我可以得到debian喘息时的值,如0X43b7。 我用i2get命令读取这些值

    $EC = `sudo i2cget -y 1 0x4a 0x00 w` ;
    

    我得到的是一个十六进制值0x34c2。使用的微控制器对这个值做了一些类似于小尾数的处理,我需要将高值字节与低值字节交换。我得到了一个提示,但在python中……我没有胶水来处理这个问题。这个Python行在Perl中有一个简单的表达式`?

               assert line.startswith("0x")
               word = int(line[2:], 16)
               yield struct.unpack(">H", struct.pack("<H", word))[0]
    

    我从来没有用Perl擦掉过字节,也不知道如何翻译。

    2 回复  |  直到 8 年前
        1
  •  1
  •   choroba    8 年前

    如果输入是字符串 0x34c2 你想得到字节 43 2c (或字符串“432c”),可以使用

    my $EC = "0x34c2";
    my $output = pack 'h4', substr $EC, 2;  # --> \x43\x2c
    my $string = unpack 'H4', $output;      # --> "432c"
    

    如果只想交换字符串中的“字节”,可以使用替换

    my $EC = "0x34c2";
    (my $output = $EC) =~ s/(..)(..)$/$2$1/;
    

    substr :

    my $EC = "0x34c2";
    my $output = $EC;
    substr $output, 4, 0, substr $output, 2, 2, q();
    
        2
  •  1
  •   ikegami    8 年前

    您不清楚需要什么输出,但我通过运行您的代码片段确定了以下内容:

    0x34c2 .

    对于输出,您需要数字49716 10 =C234 16 .

    有许多不同的方法可以使用。

    die("assert") if substr($s, 0, 2) ne "0x";
    
    my $n = unpack('S<', pack('H*', substr($s, 2)));    # If it's a LE uint16_t
      -or-
    my $n = unpack('s<', pack('H*', substr($s, 2)));    # If it's a LE int16_t
    

    或者,

    my $n = unpack('S<', pack('S>', hex($s)));          # If it's a LE uint16_t
      -or-
    my $n = unpack('s<', pack('s>', hex($s)));          # If it's a LE int16_t
    

    这两种解决方案都适用于小端和大端平台。


    从评论来看,下一行应该是:

    my $ECdec = $n/10;
    print "Electric Conductivity $ECdec µS/m\n";
    

    $ python <<'EOS'
    import struct
    line = "0x34c2"
    assert line.startswith("0x")
    word = int(line[2:], 16)
    word = struct.unpack(">H", struct.pack("<H", word))[0]
    print word
    EOS
    49716
    
    $ perl -e'
       use feature qw( say );
       my $s = "0x34c2";
       die("assert") if substr($s, 0, 2) ne "0x";
       my $word = unpack("S<", pack("H*", substr($s, 2)));
       say $word;
    '
    49716