读取探测值

时间:2016-07-03 19:39:28

标签: perl swap

我需要Perl的帮助。也许对你来说一个容易回答的问题...... 来自AD转换器我在debian wheezy上得到像0X43b7这样的值。 我用i2cget命令

读取了这个值
$EC = `sudo i2cget -y 1 0x4a 0x00 w` ;

我得到的是十六进制值0x34c2。使用过的微控制器对这个值做了一些像小端的思考,我需要将较高值字节与较低值字节交换。我得到了一个提示,但在python中...我没有胶水如何处理这个。 Perl中是否有一个简单的表达式用于此Python系列?

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

我从来没有在Perl中使用字节,而是真的不知道如何翻译它。

2 个答案:

答案 0 :(得分:1)

如果输入是字符串0x34c2,并且您希望返回字节43 2c(或字符串&#34; 432c&#34;),则可以使用

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

如果您只想交换&#34;字节&#34;在字符串中,您可以使用替换

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();

答案 1 :(得分:1)

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

对于输入,您有一个字符串,例如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

这两种解决方案都适用于little-endian和big-endian平台。

从评论中看,下一行似乎应该如下:

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