我有以下结构,来自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_value的0,然后将其放入结构中.我的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计算与服务器的计算不同?
我正在使用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内置包打包128位或256位数字(使用Crypt :: Random :: makerandom生成的AES键/ ivs)?如果是的话,我的模板X应该是什么
pack('X', ($256_bit_number));
Run Code Online (Sandbox Code Playgroud)
是?
谢谢.
在 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 中创建/发送二进制数据。协议要求固定宽度的字段,加上空间填充。使用python的struct.pack,我唯一能想到的是,计算空间填充并将其添加到自己中。有没有更好的方法来实现这一目标?
谢谢
在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!我是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) 我正在尝试使用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) 您创建一个初始根窗口,然后创建多个小部件(例如标签、按钮、事件)。
你必须将它们中的每一个都打包,并且可以通过我所知道的几种方式来完成。
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) 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()使用数组?