我需要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中使用字节,而是真的不知道如何翻译它。
答案 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