我需要传输一个不同长度的数组,其中每个元素是两个整数的元组.举个例子:
path = [(1,1),(1,2)]
path = [(1,1),(1,2),(2,2)]
Run Code Online (Sandbox Code Playgroud)
我试图使用pack和unpack,但是,由于数组的长度不同,我不知道如何创建一个格式,使得两者都知道格式.我试图将它变成带分隔符的单个字符串,例如:
msg = 1&1~1&2~
sendMsg = pack("s",msg) or sendMsg = pack("s",str(msg))
Run Code Online (Sandbox Code Playgroud)
在接收方:
path = unpack("s",msg)
Run Code Online (Sandbox Code Playgroud)
但在这种情况下只打印1.我也试图发送4个整数,只要我不包含代表路径的额外字符串,它就会发送和接收.
sendMsg = pack("hhhh",p.direction [0],p.direction [1],p.id,p.health)
在接收方:
x,y,id,health = unpack("hhhh",msg)
Run Code Online (Sandbox Code Playgroud)
第一个是插图,因为我试图发送格式"hhhhs",但无论哪种方式路径都没有正确通过.
谢谢您的帮助.我还将研究发送一个二维数组的整数,但我似乎无法弄清楚如何在网络中发送这些更"复杂"的结构.
谢谢您的帮助.
我对Perl相对缺乏经验,但我的问题是在获取数值的位时解压缩函数.例如:
my $bits = unpack("b*", 1);
print $bits;
Run Code Online (Sandbox Code Playgroud)
这导致打印10001100,其为十进制140.按相反的顺序,它是十进制的49.我试过的任何其他值似乎给出了不正确的位.
但是,当我通过pack运行$ bits时,它再次生成1.这里有什么我想念的吗?
当我认为我的问题得到解决时,我似乎得出了结论.也许我应该简单解释一下我正在尝试做什么.
我需要将一个可能大到24位长的整数值(可能大于一个字节)转换为位串.这可以使用@ikegami建议的解包和打包来完成,但我还需要找到一种方法将该位串转换回它的原始整数(不是它的字符串表示).
正如我所提到的,我对Perl相对缺乏经验,而且我一直在尝试没有成功.
我找到了似乎是最佳解决方案:
my $bits = sprintf("%032b", $num);
print "$bits\n";
my $orig = unpack("N", pack("B32", substr("0" x 32 . $bits, -32)));
print "$orig\n";
Run Code Online (Sandbox Code Playgroud) 我有以下结构,来自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计算与服务器的计算不同?
背景
我有一个设备连接到我的机器上的串行端口是面向消息的,其中每个传入的命令消息恰好是8个16位字.首先接收每个字的最高有效字节,然后接收最低有效字节.每个标题字是命令标识符(范围从0到255).格式定义如下:
XXXX Header Word (Placeholder for 16-bit Hexadecimal value)
XXXX Data Word
XXXX Data Word
XXXX Data Word
XXXX Data Word
XXXX Data Word
XXXX Data Word
XXXX Checksum Word (Result of Exclusive OR on header word and all six data words)
Run Code Online (Sandbox Code Playgroud)
我需要发送的命令的格式,标头0x5D,定义如下:
Word 1: Header = 005Dh
Word 2: Mode (values can be 2, 3, 6, 8, 9)
Words 3-7: Not significant
Word 8: 16 bit checksum
Run Code Online (Sandbox Code Playgroud)
问题(全部相关)
我从其他源代码中得到了这个示例,显然正确地发送了这条消息,但我不确定发生了什么,即使在读取包上的perldoc之后也是如此.
pack("v"x8, 0x00, 0x5D, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, …Run Code Online (Sandbox Code Playgroud) 在我的机器PHP_INT_SIZE上8,pack('i',1)无论如何返回一个4字节的字符串.
文档说i是一个"有符号整数(机器相关的大小和字节顺序)",但似乎并非如此.它固定为4个字节?
这意味着unpack('i',pack('i',PHP_INT_MAX))[1] !== PHP_INT_MAX在64位计算机上,因为一半的数据被删除了.
以下代码有效:
#include <iostream>
#include <list>
struct Base {};
struct A : Base {}; struct B : Base {}; struct C : Base {};
struct D : Base {}; struct E : Base {}; struct F : Base {};
template <int KEY, typename... RANGE> struct Map {}; // one-to-many map (mapping KEY to RANGE...)
template <typename...> struct Data {};
using Database = Data< Map<0, A,B,C>, Map<1, D,E,F> >;
template <int N, typename FIRST, typename... REST> // N has meaning in my …Run Code Online (Sandbox Code Playgroud) 我正在将烧录应用程序中的音频从客户端传输到服务器,但收到的音频质量非常低.
在客户端,我按如下方式预处理音频缓冲区:
this.node.onaudioprocess = function(e){
var buf = e.inputBuffer.getChannelData(0);
var out = new Int16Array(buf.length);
for (var i = 0; i < buf.length; i++){
var s = Math.max(-1, Math.min(1, buf[i]));
out[i] = s < 0 ? s * 0x8000 : s * 0x7FFF;
}
socket.emit('audio event',{data: out})
return;
}
Run Code Online (Sandbox Code Playgroud)
在服务器端,我收到如下音频:
audio_file = open('tempfile.raw', 'w')
@socketio.on('audio event')
def audio_message(message):
dat = [v[1] for v in sorted(message['data'].iteritems())]
n = len(dat)
byteval = struct.pack('<'+str(n)+'h',*dat)
audio_file.write(byteval)
Run Code Online (Sandbox Code Playgroud)
但由此产生的音频听起来很金属,中断和嘈杂.以下是结果波形的外观:
在我的代码中,音频质量丢失了吗?如何在没有质量损失的情况下传输音频?
我正在使用 Windows 版 Git(版本 2.15,但同样的问题出现在 2.14 中,我认为旧版本也有),并且我注意到一个相当烦人的行为:当我执行一些基本的 git 操作*)时,.git 的修改日期/objects/pack/pack-*.pack 文件更改。文件本身保持不变,但上次修改日期字段已更新,这导致我的备份软件认为文件已更改并需要添加到我的差异备份中。由于我的 .pack 文件相当大,这会显着增加我每日备份的大小。有没有办法阻止这种行为?也就是说,保持包文件完全不变,包括其元数据,直到我执行 git gc 或 git repack?
不幸的是,我无法确定哪个操作导致了这种行为。今天发生这种情况时,我只使用了 git status、git log、git add、git mv 和 git commit,没有使用其他任何东西,并且日期/时间发生了更改,但是当我尝试在昨天的备份上复制该行为时,日期更改并没有不会发生。我想下次我将运行进程监视器并监视对文件的访问,但与此同时,有人知道可能导致此问题的原因吗?谢谢。
根据文档https://docs.npmjs.com/files/package.json#files,如果将目录放在package.jsonfiles部分中,则无论如何都会排除指定目录中的某些文件 - 包括. DS_Store。此外,.gitignore或.npmignore中的文件应排除package.json文件部分中指定的任何目录内的文件。
我的package.json files条目是["src", "bin"],但是当我运行时,src中的.DS_Store文件仍然进入 tarball 中。.DS_Store也在.gitignore中,但无论设置如何,npm 都应该排除它。npm pack
README.md文件已正确自动包含,但如果不明确包含我想要包含在package.json部分中的所有文件扩展名,我就无法让.DS_Store消失。files
我尝试了 NPM 6.4.1 和 6.9.0 并得到了相同的结果,我在这里遗漏了什么吗?
请考虑这个示例代码:
package main
//#include <stdio.h>
//#include <stdint.h>
//#pragma pack(push, 1)
//struct Packed_Struct {
// uint16_t A;
// uint16_t B;
// uint32_t C;
// uint16_t D;
//};
//#pragma pack(pop)
//
//struct UnPacked_Struct {
// uint16_t A;
// uint16_t B;
// uint32_t C;
// uint16_t D;
//};
//
//
//void print_C_struct_size(){
// struct Packed_Struct Packed_Struct;
// struct UnPacked_Struct UnPacked_Struct;
// printf("Sizeof Packed_Struct: %lu\n", sizeof(Packed_Struct) );
// printf("Sizeof UnPacked_Struct: %lu\n", sizeof(UnPacked_Struct) );
// return;
//}
//
import "C"
import(
"fmt"
"unsafe"
)
type …Run Code Online (Sandbox Code Playgroud)