标签: pack

在Python中计算struct的CRC

我有以下结构,来自C中的NRPE守护进程代码:

typedef struct packet_struct {
  int16_t packet_version;
  int16_t packet_type;
  uint32_t crc32_value;
  int16_t result_code;
  char buffer[1024];
} packet;
Run Code Online (Sandbox Code Playgroud)

我想将这种数据格式从Python发送到C守护进程.CRC是在何时计算crc32_value0,然后将其放入结构中.我的Python代码如下:

cmd = '_NRPE_CHECK'
pkt = struct.pack('hhIh1024s', 2, 1, 0, 0, cmd)
# pkt has length of 1034, as it should
checksum = zlib.crc32(pkt) & 0xFFFFFFFF
pkt = struct.pack('hhIh1024s', 2, 1, checksum, 0, cmd)
socket.send(....)
Run Code Online (Sandbox Code Playgroud)

守护程序正在接收以下值: version=2 type=1 crc=FE4BBC49 result=0

但它正在计算 crc=3731C3FD

计算CRC的实际C代码是:

https://github.com/KristianLyng/nrpe/blob/master/src/utils.c

它通过以下方式调用:

calculate_crc32((char *)packet, sizeof(packet));

当我将这两个函数移植到Python时,我会得到与zlib.crc32返回相同的函数.

我的struct.pack电话是否正确?为什么我的CRC计算与服务器的计算不同?

python struct crc pack nrpe

5
推荐指数
1
解决办法
1573
查看次数

在perl中使用'pack'函数发送数组的问题

我正在使用pack函数将列表的内容发送到套接字.代码如下.

$message_array = pack ("(A*)*", @ul_dcch_message);
Run Code Online (Sandbox Code Playgroud)

列表内容是

@ul_dcch_message = (101101012411011, "emergency", 25, "simple");
Run Code Online (Sandbox Code Playgroud)

这段代码发送列表中包含的所有字符串和数字.但如果列表中的数字超过15位,我会得到这样的东西,

 1.01101012411011e+16emergency25simple
Run Code Online (Sandbox Code Playgroud)

我的要求是,我想"打包"数字和字符串,数字将超过15位或更多.

有什么办法吗?有没有其他模板可以做到这一点?

任何帮助表示赞赏.

perl pack

4
推荐指数
1
解决办法
716
查看次数

如何打包128位或256位数字

是否可以使用perl内置包打包128位或256位数字(使用Crypt :: Random :: makerandom生成的AES键/ ivs)?如果是的话,我的模板X应该是什么

pack('X', ($256_bit_number)); 
Run Code Online (Sandbox Code Playgroud)

是?

谢谢.

perl pack

4
推荐指数
1
解决办法
801
查看次数

包格式字符串中的自动重复标志

在 php 中,unpack() 有“*”标志,意思是“重复这个格式直到输入结束”。例如,这会打印 97、98、99

$str = "abc";
$b = unpack("c*", $str);
print_r($b);
Run Code Online (Sandbox Code Playgroud)

python中有这样的东西吗?当然,我可以

str = "abc"
print struct.unpack("b" * len(str), str)
Run Code Online (Sandbox Code Playgroud)

但我想知道是否有更好的方法。

python pack

4
推荐指数
2
解决办法
2094
查看次数

带有空格填充的python结构包

我需要使用给定的协议在 python 中创建/发送二进制数据。协议要求固定宽度的字段,加上空间填充。使用python的struct.pack,我唯一能想到的是,计算空间填充并将其添加到自己中。有没有更好的方法来实现这一目标?

谢谢

python struct pack

4
推荐指数
1
解决办法
6592
查看次数

pack()和unpack()如何在Ruby中工作

在Ruby中为什么我们需要数组Packing?如何directive帮助做这样的包装?

我在我的控制台中运行了一些代码,以查看Array包装中的指令是什么以及如何.但输出与每个指令完全相同.然后在核心他们如何不同?

irb(main):003:0> n = [ 65, 66, 67 ]
=> [65, 66, 67]
irb(main):004:0> n.pack("ccc")
=> "ABC"
irb(main):005:0> n.pack("C")
=> "A"
irb(main):006:0> n.pack("CCC")
=> "ABC"
irb(main):007:0> n.pack("qqq")
=> "A\x00\x00\x00\x00\x00\x00\x00B\x00\x00\x00\x00\x00\x00\x00C\x00\x00\x00\x00\
x00\x00\x00"
irb(main):008:0> n.pack("QQQ")
=> "A\x00\x00\x00\x00\x00\x00\x00B\x00\x00\x00\x00\x00\x00\x00C\x00\x00\x00\x00\
x00\x00\x00"
irb(main):009:0> n.pack("SSS")
=> "A\x00B\x00C\x00"
irb(main):010:0> n.pack("sss")
=> "A\x00B\x00C\x00"
irb(main):011:0>
Run Code Online (Sandbox Code Playgroud)

现在我可以从控制台看到它n.pack("SSS") and n.pack("sss");n.pack("ccc") and n.pack("CCC"); n.pack("qqq") and n.pack("QQQ")提供相同的输出.然后差异在哪里?

文档也没有涵盖每个指令在现实生活中如何工作的一些例子.我也对下面的指令感到困惑,因为我不知道如何测试它们?任何带有它们的小代码对我都有帮助:

  • S_, S!
  • S> L> Q>
  • S!< I!<
  • L_, L!

ruby unpack binary-data pack ruby-1.9.3

4
推荐指数
1
解决办法
3863
查看次数

python pack()和grid()方法在一起

我是python的新手所以请原谅我的Noob-ness.我试图在我的应用程序窗口底部创建一个状态栏,但似乎每次我在同一个文件中一起使用pack()和grid()方法时,主应用程序窗口都不会打开.当我注释掉说明statusbar.pack(side = BOTTOM,fill = X)的行时,我的应用程序窗口打开正常,但是如果我将它留在其中则不会,并且如果我注释掉任何使用网格方法的行窗口打开,状态栏.看起来我只能使用pack()或grid(),但不能同时使用两者.我知道我应该可以使用这两种方法.有什么建议?这是代码:

from Tkinter import *
import tkMessageBox

def Quit():
 answer = tkMessageBox.askokcancel('Quit', 'Are you sure?')
 if answer:
    app.destroy()

app = Tk()
app.geometry('700x500+400+200')
app.title('Title')

label_1 = Label(text = "Enter number")
label_1.grid(row = 0, column = 0)
text_box1 = DoubleVar() 
input1 = Entry(app, textvariable = text_box1)
input1.grid(row = 0, column = 2)

statusbar = Label(app, text = "", bd = 1, relief = SUNKEN, anchor = W)
statusbar.pack(side = BOTTOM, fill = X)

startButton = Button(app, text = …
Run Code Online (Sandbox Code Playgroud)

python grid tkinter pack

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

用比特场包装bools(C++)

我正在尝试使用C++与Ada代码进行交互,因此我使用位字段定义结构,以便所有数据在两种语言中都处于相同的位置.以下不是我正在做的,但概述了问题.以下也是VS2008中的控制台应用程序,但这不是超级相关的.

using namespace System;
int main() {
    int array1[2] = {0, 0};
    int *array2 = new int[2]();
    array2[0] = 0;
    array2[1] = 0;

    #pragma pack(1)
    struct testStruct {
        // Word 0 (desired)
        unsigned a : 8;
        unsigned b : 1;
        bool c : 1;
        unsigned d : 21;
        bool e : 1;

        // Word 1 (desired)
        int f : 32;

        // Words 2-3 (desired)
        int g[2]; //Cannot assign bit field but takes 64 bits in my compiler
    };
    testStruct test; …
Run Code Online (Sandbox Code Playgroud)

c++ struct pragma pack bit-fields

4
推荐指数
2
解决办法
2623
查看次数

您可以一次打包多个 Tkinter 小部件而不是单独打包它们吗?

您创建一个初始根窗口,然后创建多个小部件(例如标签、按钮、事件)。

你必须将它们中的每一个都打包,并且可以通过我所知道的几种方式来完成。

Button(root, text="Button1", command=something).pack()
Run Code Online (Sandbox Code Playgroud)

或者

btn1 = Button(root, text="Button1", command=something)
btn1.pack()
Run Code Online (Sandbox Code Playgroud)

是否可以一次性打包分配给“root”的多个小部件,而不使用 for 循环并显式命名项目,如下所示:

for item in [btn1, btn2, label1, label2]:
    item.pack()
Run Code Online (Sandbox Code Playgroud)

python tkinter pack

4
推荐指数
1
解决办法
3499
查看次数

PHP将数组传递给pack()函数

pack()语法是(来自http://php.net/manual/en/function.pack.php)

string pack ( string $format [, mixed $args [, mixed $... ]] )

假设我需要打包三个字节

$packed = pack( "c*", 65, 66, 67 );

但是,如果我必须打包任意数量的字节怎么办?

它们可以方便地存储到一个数组中,所以我天真地尝试过

$a = array( 65, 66, 67 );
$packed = pack( "c*", $a );
Run Code Online (Sandbox Code Playgroud)

但它不起作用.

有没有办法pack()使用数组?

php arrays pack

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

标签 统计

pack ×10

python ×5

struct ×3

perl ×2

tkinter ×2

arrays ×1

binary-data ×1

bit-fields ×1

c++ ×1

crc ×1

grid ×1

nrpe ×1

php ×1

pragma ×1

ruby ×1

ruby-1.9.3 ×1

unpack ×1