标签: pack

如何在不实际拆包的情况下获取Perl中的打包物品数量?

我有一串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吗?

perl unpack pack

3
推荐指数
1
解决办法
224
查看次数

如何使用包或网格实现以下Tkinter GUI布局?

这是我目前的棋盘游戏GUI布局:

跳棋游戏

如你所见,它包括一个顶部的菜单,左边的画布,我绘制棋盘,右上角的工具栏(框架),我有各种格式/导航按钮,和一个使用的文本小部件注释移动.目前,我正在为小部件使用网格布局.

这是我需要做的事情:

  1. 当文本量大于窗口小部件大小时,能够在"文本"窗口小部件中显示/隐藏滚动条.(根据这篇文章,这似乎需要网格布局.)
  2. 通过"首选项"对话框更改"文本"窗口小部件中文本的字体和/或大小,而不会在"文本"窗口小部件周围留下奇怪的间隙.(这似乎需要一个包布局,因为Text小部件只能给出字符的宽度和高度而不是像素......这意味着当我更改字体或大小时,Text小部件会增大或缩小,并且窗口不会调整为了适应网格布局.我一直在尝试使用Font.measure根据所选字体调整文本小部件的大小,但我仍然会得到间隙,因为我无法将小部件调整到精确的像素.)
  3. 我的最终解决方案需要跨平台(Windows和Linux,希望是Mac).

我可以使用哪种布局来满足我的要求?如果两者都不能完全发挥作用,那么哪种布局(网格或包装)会让我最接近目标?谢谢!

python grid layout tkinter pack

3
推荐指数
1
解决办法
5804
查看次数

Perl中字符串的最快校验位例程是什么?

给定一串数字,我必须使用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)

perl unpack pack

3
推荐指数
1
解决办法
399
查看次数

Perl打包/解包和二进制字符串的长度

考虑这个简短的例子:

$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)的值被正确保留?

perl bytearray unpack pack

3
推荐指数
1
解决办法
3046
查看次数

用于C++的打包/解包功能

注意:我知道之前已经多次询问过这个问题,但是这些问题都没有链接到具体的,可移植的,维护的库.

我需要一个实现Python/Ruby/Perl like pack/ unpackfunctions 的C或C++库.这样的图书馆存在吗?

编辑:因为我发送的数据很简单,所以我决定只使用memcpy,指针和hton*函数.我是否需要以char任何方式操纵a 以平台无关的方式通过网络发送它?(char仅用作字节,而不是字符).

c++ serialization unpack pack

3
推荐指数
2
解决办法
1万
查看次数

PHP Pack/unpack - 它可以处理可变长度的字符串

我一直试图弄清楚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版本不支持的东西?

php unpack pack

3
推荐指数
1
解决办法
3330
查看次数

加快我对HyperLogLog算法的实施

我自己实现了HyperLogLog algorithm.它运作良好,但有时我必须获取很多(大约10k-100k)的HLL结构并合并它们.

我将它们中的每一个存储为一个位串,所以首先我必须将每个位串转换为桶.由于有很多HLL,它需要的时间比我想要的多.

目前大约80%的运行时为每个HLL调用一行代码:

my @buckets = map { oct '0b'.$_ } unpack('(a5)1024', $bitstring);

有没有办法更快地做到这一点?

如果我们留下HyperLogLog的定义,那么任务可以这样解释:假设$bitstring由1024个5位计数器组成(因此每个计数器的值最多为32),我们必须将其转换为1024个整数的数组.

perl unpack pack hyperloglog

3
推荐指数
1
解决办法
261
查看次数

在Windows上,struct.pack(!i,10)结果为"00 00 00 0d 0a"

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,我该怎么办呢?

python struct pack

3
推荐指数
1
解决办法
323
查看次数

关于unpack()和printf()中的v标志的Perl问题

我想完成以下事项:

对于任意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)

perl printf for-loop unpack pack

3
推荐指数
1
解决办法
174
查看次数

打包和解包浮点数时,如何消除浮点不准确?

我正在打包一个数字数组,通过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)

有什么方法可以控制精度吗?

perl unpack pack

3
推荐指数
1
解决办法
158
查看次数

标签 统计

pack ×10

unpack ×8

perl ×6

python ×2

bytearray ×1

c++ ×1

for-loop ×1

grid ×1

hyperloglog ×1

layout ×1

php ×1

printf ×1

serialization ×1

struct ×1

tkinter ×1