我有一串packed值,这些值是使用以下内容顺序创建的:
while (...) {
...
$packed .= pack( 'L', $val );
}
Run Code Online (Sandbox Code Playgroud)
在另一个程序中,我加载后$packed,我想知道实际打包了多少个值.我知道如何做到这一点unpack:
my @vals = unpack( 'L*', $packed );
print scalar(@vals);
Run Code Online (Sandbox Code Playgroud)
但这真的有必要吗?如果我只关心值的数量,我可以做得更好并跳过unpacking吗?
这是我目前的棋盘游戏GUI布局:

如你所见,它包括一个顶部的菜单,左边的画布,我绘制棋盘,右上角的工具栏(框架),我有各种格式/导航按钮,和一个使用的文本小部件注释移动.目前,我正在为小部件使用网格布局.
这是我需要做的事情:
我可以使用哪种布局来满足我的要求?如果两者都不能完全发挥作用,那么哪种布局(网格或包装)会让我最接近目标?谢谢!
给定一串数字,我必须使用Perl尽可能快地对所有数字求和.
我的第一个实现用unpack()解包数字,然后用List :: Utils的sum()对数字列表求和.它的速度非常快,但是这个任务有更快的打包/解包配方吗?
我试着使用pack/unpack组合,并对这两个实现进行了基准测试.二手CPU时间几乎相同; 也许有一些我不知道的快速技巧?
以下是我的基准测试方法:
#!/usr/bin/env perl
use 5.012;
use strict;
use List::Util qw/sum/;
use Benchmark qw/timethese/;
timethese ( 1000000, {
list_util => sub {
my $CheckDigit = "999989989";
do {
$CheckDigit = sum( unpack( 'AAAAAAAAA', $CheckDigit ) );
} while ( $CheckDigit > 9 );
},
perl_only => sub {
my $CheckDigit = "999989989";
do {
$CheckDigit = unpack( '%16S*', pack( 'S9', unpack( 'AAAAAAAAA', $CheckDigit ) ) );
} while ( $CheckDigit > 9 );
},
} …Run Code Online (Sandbox Code Playgroud) 考虑这个简短的例子:
$a = pack("d",255);
print length($a)."\n";
# Prints 8
$aa = pack("ddddd", 255,123,0,45,123);
print length($aa)."\n";
# Prints 40
@unparray = unpack("d "x5, $aa);
print scalar(@unparray)."\n";
# Prints 5
print length($unparray[0])."\n"
# Prints 3
printf "%d\n", $unparray[0] '
# Prints 255
# As a one-liner:
# perl -e '$a = pack("d",255); print length($a)."\n"; $aa = pack("dd", 255,123,0,45,123); print length($aa)."\n"; @unparray = unpack("d "x5, $aa); print scalar(@unparray)."\n"; print length($unparray[0])."\n"; printf "%d\n", $unparray[0] '
Run Code Online (Sandbox Code Playgroud)
现在,我希望双精度浮点数为8个字节,所以第一个length($a)是正确的.但是为什么unpack(length($unparray[0]))报告3 之后的长度- 当我试图以完全相同的方式返回时(双精度,即8个字节) - 并且项目(255)的值被正确保留?
注意:我知道之前已经多次询问过这个问题,但是这些问题都没有链接到具体的,可移植的,维护的库.
我需要一个实现Python/Ruby/Perl like pack/ unpackfunctions 的C或C++库.这样的图书馆存在吗?
编辑:因为我发送的数据很简单,所以我决定只使用memcpy,指针和hton*函数.我是否需要以char任何方式操纵a 以平台无关的方式通过网络发送它?(char仅用作字节,而不是字符).
我一直试图弄清楚Pack/Unpack的PHP实现是否可以做Perl版本能够做的事情.我希望能用PHP做的例子是:
http://perldoc.perl.org/perlpacktut.html#String-Lengths
# pack a message: ASCIIZ, ASCIIZ, length/string, byte
my $msg = pack( 'Z* Z* C/A* C', $src, $dst, $sm, $prio );
# unpack
( $src, $dst, $sm, $prio ) = unpack( 'Z* Z* C/A* C', $msg );
Run Code Online (Sandbox Code Playgroud)
这个Perl代码的作用描述如下:
将两个包代码与斜杠(/)组合在一起,将它们与参数列表中的单个值相关联.在pack中,根据第一个代码获取和打包参数的长度,而在使用斜杠后的模板代码转换后添加参数本身.
即你可以打包可变长度的字符串,然后一步解压缩它们,而不是先弄清字符串的长度,然后再将它作为一个单独的步骤解压缩.
PHP手册没有提到这个功能,任何尝试在解包中插入像'C/A*'这样的模式都给我带来了错误.这是手册中的疏忽还是PHP版本不支持的东西?
我自己实现了HyperLogLog algorithm.它运作良好,但有时我必须获取很多(大约10k-100k)的HLL结构并合并它们.
我将它们中的每一个存储为一个位串,所以首先我必须将每个位串转换为桶.由于有很多HLL,它需要的时间比我想要的多.
目前大约80%的运行时为每个HLL调用一行代码:
my @buckets = map { oct '0b'.$_ } unpack('(a5)1024', $bitstring);
有没有办法更快地做到这一点?
如果我们留下HyperLogLog的定义,那么任务可以这样解释:假设$bitstring由1024个5位计数器组成(因此每个计数器的值最多为32),我们必须将其转换为1024个整数的数组.
我struct.pack("!i", 10)在Windows系统上发现了一个奇怪的Python问题.我得到缓冲区并将其保存到文件中,但结果是
00 00 00 0d 0a
Run Code Online (Sandbox Code Playgroud)
在Mac OSX上的结果是
00 00 00 0a
Run Code Online (Sandbox Code Playgroud)
什么0d意思?
当我通过11而不是10,结果是00 00 00 0b.所以我想当我通过时10,结果应该是00 00 00 0a.
如果我想00 00 00 0a通过10,我该怎么办呢?
我想完成以下事项:
对于任意Perl字符串(无论它是否以UTF-8内部编码,以及是否设置了UTF-8标志),从左到右扫描字符串,对于每个字符,打印Unicode代码点以十六进制格式表示该字符.为了让自己绝对清楚:我不想打印UTF-8字节序列或其他东西; 我只想为字符串中的每个字符打印Unicode代码点.
首先,我提出了以下解决方案:
#!/usr/bin/perl -w
use warnings;
use utf8;
use feature 'unicode_strings';
binmode(STDOUT, ':encoding(UTF-8)');
binmode(STDIN, ':encoding(UTF-8)');
binmode(STDERR, ':encoding(UTF-8)');
$Text = "\x{3B1}\x{3C9}";
print $Text."\n";
printf "%vX\n", $Text;
# Prints the following to the console (the console is UTF8):
# ??
# 3B1.3C9
Run Code Online (Sandbox Code Playgroud)
然后我看到了一些例子,但没有合理的解释,这让我怀疑我的解决方案是正确的,现在我对自己的解决方案以及示例都有疑问.
1)Perl关于(...)printf中v标志的文档说:
"这个标志告诉Perl将提供的字符串解释为整数向量,字符串中的每个字符都有一个.[...]"
但它没有说明"整数向量"究竟意味着什么.在查看我的示例的输出时,似乎那些整数是Unicode代码点,但我希望确认这一点的人确认了这一点.
因此问题是:
1)我们可以确定从字符串中拉出的每个整数都是相应字符的Unicode代码点(而不是其他字节序列)吗?
其次,关于我找到的一个例子(略有修改;我不记得我从哪里得到它,也许来自Perl文档):
#!/usr/bin/perl -w
use warnings;
use utf8;
use feature 'unicode_strings';
binmode(STDOUT, ':encoding(UTF-8)');
binmode(STDIN, ':encoding(UTF-8)');
binmode(STDERR, ':encoding(UTF-8)');
$Text = "\x{3B1}\x{3C9}";
print $Text."\n";
printf "%vX\n", $Text for unpack('C0A*', $Text);
# …Run Code Online (Sandbox Code Playgroud) 我正在打包一个数字数组,通过UDP使用套接字编程发送到另一个硬件.
当我pack的数字12.2然后unpack它,我得到12.199999892651.当我处理与纬度和经度相关的数字时,我不能有这样的偏差.
这是我写的简单脚本:
use warnings;
use Time::HiRes qw (sleep);
@Data = ( 20.2, 30.23, 40.121, 1, 2, 3, 4, 6. 4, 3.2, 9.9, 0.1, 12.2, 0.99, 7.8, 999, 12.3 );
$myArr = pack('f*', @Data);
print "$myArr\n\n";
@Dec = unpack('f*',$myArr);
print "@Dec";
Run Code Online (Sandbox Code Playgroud)
输出是:
20.2000007629395 30.2299995422363 40.1209983825684 1 2 3 4 6.40000009536743 3.20 000004768372 9.89999961853027 0.100000001490116 12.1999998092651 0.9900000095367 43 7.80000019073486 999 12.3000001907349
Run Code Online (Sandbox Code Playgroud)
有什么方法可以控制精度吗?