我已经在Perl中遇到了这个问题几天了,在搜索了无数的手册,perldocs和谷歌搜索太多的搜索条件后,希望这里有人可以帮助我.
我有两个代表十六进制值的字符串,即"FFFF",而不是Perl十六进制数0xFFFF.给定其中两个字符串,我希望将它们转换为二进制形式,对两者执行按位AND,然后获取此输出并检查从LSB到MSB的每个位.
我现在有两个问题; 将十六进制字符串转换为十六进制数字,并移位按位AND的结果.
为了将十六进制字符串转换为十六进制数字,我尝试了以下方法,当我打印出来检查时,这些方法似乎不起作用:
$a = unpack("H*", pack("N*", $a));
$a = sprintf("%H", $a);
Run Code Online (Sandbox Code Playgroud)
使用'print'来检查每一个都没有显示正确的值,也没有使用'sprintf'...
我执行按位AND后发生的第二个问题,我想通过向右移1来检查每个位.为了避免先前的问题,我使用实际的Perl十六进制数而不是十六进制字符串(0xffff而不是"ffff") .如果我尝试按如下方式执行右移:
#Convert from hex number to binary number
$a = sprintf("%B", $a);
$b = sprintf("%B", $b);
$temp = pack("B*", $a) & pack("B*", $b);
$output = unpack("B*", $temp);
Run Code Online (Sandbox Code Playgroud)
此时一切看起来都很好,并且使用'print'我可以看到AND操作的值看起来正确,但是当我尝试按如下方式移动时:
$output = pack("B*", $output);
$output = $output >> 1;
$output = unpack("B*", $output);
Run Code Online (Sandbox Code Playgroud)
我得到的结果值是二进制形式,但不正确.
执行此类操作的正确方法是什么?
我做了以下事情.
from struct import pack, unpack
t = 1234
tt = str(pack("<I", t))
Run Code Online (Sandbox Code Playgroud)
打印tt给出\xf3\xe0\x01\x00.如何t从tt 获取原始值?
我尝试使用解压缩,repr(tt)但这没有用.我该怎么做呢?
我想在数据库中将哈希保存为打包字符串,我得到包装部分确定,但是我遇到了问题
测试哈希
my $hash = {
test_string => 'apples,bananas,oranges',
test_subhash => { like => 'apples' },
test_subarray => [ red, yellow, orange ]
}
Run Code Online (Sandbox Code Playgroud)
我想也许我可以在这个例子中使用JSON:XS 将哈希转换为json字符串,然后打包JSON字符串......
关于这种方法的想法?
有人可以解释我为什么这不能像我期望的那样工作吗?
zen:~ emx$ echo ABC | perl -nle "print unpack 'H*'"
414243
zen:~ emx$ echo 414243 | perl -nle "print pack 'H*'"
zen:~ emx$
Run Code Online (Sandbox Code Playgroud)
不知何故,我期待第二个命令打印ABC
我需要提取一系列两个字符(我将其传递给解包,因为它们实际上是一种奇怪的BCD形式).我目前使用:
my @whatever = unpack('a2 a2 a2 a2 a2 a2 a2', get_bcd_string());
Run Code Online (Sandbox Code Playgroud)
似乎我不能使用像[6]重复因素那样的东西a2,但我想确定一下.
我意识到我可以只使用a12字符串提取并拆分字符串,但我正在尝试学习是否可以更有效地使用解压缩.
谢谢
我需要从IMU输出十六进制数据流到lat long和height值.
数据以双精度十六进制字符串形式出现,我需要将它们输出为十进制值.
我尝试了几个打包和解压缩值,但最终除了编写自己的函数之外无法找到解决方案.
有没有办法翻译这个双精度64位十六进制字符串:
"4044F33333333333"
Run Code Online (Sandbox Code Playgroud)
进入这个小数:
41.900000000000000
Run Code Online (Sandbox Code Playgroud)
使用打包和解包功能?
有没有能够处理IEEE 754号码的图书馆?
我有一个窗口,提示用户输入其日志文件的目录。但是,我的标签似乎贴在输入框的顶部。关于如何将它们并排包装的任何想法吗?
labelText=StringVar()
labelText.set("Enter directory of log files")
labelDir=Label(app,textvariable=labelText,height=4)
labelDir.pack()
directory=StringVar(None)
dirname=Entry(app,textvariable=directory,width=50)
dirname.pack()
Run Code Online (Sandbox Code Playgroud) 我有一个无符号整数数组(32位),我想pack进入二进制流:
my @n = (4,8,15,16,23,42);
my $foo = join('', map(pack('I', $_), @n)); # Ugly, isn't?
Run Code Online (Sandbox Code Playgroud)
$foo 应该包含这个二进制流(取决于字节顺序)
0000000 0000 0004 0000 0008 0000 000F 0000 0010
0000010 0000 0017 0000 002A
Run Code Online (Sandbox Code Playgroud)
然后我想将unpack二进制流返回一个数组.
如何使用Perl正确执行此操作,如果可能,仅使用内置模块?
我正在尝试将小端字节转换为大端字节。
例:
小尾数法:
E1 31 01 00 00 9D
大端:
9D 00 00 01 31 E1
Ultimately my goal is to convert a hexdump of data to the correct floating point value. I have set up my shell script to isolate the individual hex values I need to look at and arrange them in the correct order for a little Endian float conversion.
To simplify everything, I'll bypass the code I have managed to get working, and I'll start with:
rawHex=0x41000000
echo $(perl -e 'print unpack "f", pack "L", $ENV{rawHex}')
Run Code Online (Sandbox Code Playgroud)
When I execute this code, the …