小编sou*_*kah的帖子

在Python中计算/验证bz2(bzip2)CRC32

我正在尝试计算/验证压缩bzip2档案的CRC32校验和.

.magic:16                       = 'BZ' signature/magic number
.version:8                      = 'h' for Bzip2 ('H'uffman coding)
.hundred_k_blocksize:8          = '1'..'9' block-size 100 kB-900 kB

.compressed_magic:48            = 0x314159265359 (BCD (pi))
.crc:32                         = checksum for this block
...
... 
.eos_magic:48                   = 0x177245385090 (BCD sqrt(pi))
.crc:32                         = checksum for whole stream
.padding:0..7                   = align to whole byte
Run Code Online (Sandbox Code Playgroud)

http://en.wikipedia.org/wiki/Bzip2

所以我知道CRC校验和在bz2文件中的位置,但我将如何验证它们.我应该用什么块binascii.crc32()来获得两个CRC?我已经尝试逐字节计算各种块的CRC,但还没有设法得到匹配.

谢谢.我将研究bzip2源bz2代码和Python库代码,以便找到一些东西,特别是在decompress()方法中.

更新1:

就我所见,块标题由以下标记标识.但是小的bz2文件不包含ENDMARK文件.(感谢adw,我们发现应该查找ENDMARK的位移值,因为压缩数据没有填充到字节.)

#define BLOCK_HEADER_HI  0x00003141UL
#define BLOCK_HEADER_LO  0x59265359UL

#define BLOCK_ENDMARK_HI 0x00001772UL
#define BLOCK_ENDMARK_LO 0x45385090UL
Run Code Online (Sandbox Code Playgroud)

这是从bzlib2recover.c源,块似乎始终在第80位,就在CRC校验和之前,这应该从CRC计算中省略,因为一个人不能将它自己的CRC校准为相同的CRC(你得到我的观点) …

c python crc32 crc bzip2

6
推荐指数
1
解决办法
3513
查看次数

低级控制台输入和重定向

我正在尝试cmd.exe使用低级读/写控制台功能将命令发送到应用程序的输入.在连接到进程控制台之后使用ReadConsole...()WriteConsole()函数读取文本(抓取)没有问题,但是我没有弄清楚如何编写示例"dir"并让控制台将其解释为已发送命令.

这是我的一些代码:

CreateProcess(NULL, "cmd.exe", NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
AttachConsole(pi.dwProcessId);

strcpy(buffer, "dir");
WriteConsole(GetStdHandle(STD_INPUT_HANDLE), buffer, strlen(buffer), &charRead, NULL);
Run Code Online (Sandbox Code Playgroud)

STARTUPINFO除了.cb属性之外,进程的属性都被设置为零.

在屏幕上没有什么变化,但是我发现了一个Error 6: Invalid Handle从返回WriteConsoleSTD_INPUT_HANDLE.如果我写信给(STD_OUTPUT_HANDLE)我,我会dir写在屏幕上,但当然没有任何事情发生.我猜SetConsoleMode()可能会有所帮助,但我尝试了很多模式组合,没有任何帮助.我还创建了一个快速控制台应用程序,等待输入(scanf())并回显任何进入,无法正常工作.

我也尝试输入提示scanf()然后使用PeekConsoleInput(),查看输入缓冲区,返回0,但INPUT_RECORD数组为空.

我知道还有另外一种方法WriteConsoleInput()可以直接将INPUT_RECORD结构化事件注入控制台,但这太长了,我必须将每个按键发送到它.

我希望这个问题很清楚.如果您需要任何进一步的信息,请告诉我.谢谢你的帮助.

更新1:

我能够发送按键的cmd使用过程WriteConsoleInput()INPUT_RECORD然而结构,中,AttachConsole有时会抛出ERROR_GEN_FAILURE #31: A device attached to the system is …

c windows console winapi

6
推荐指数
1
解决办法
3332
查看次数

可重用的屏障算法

我正在研究“The Little Book Of Semaphores”一书中的可重用屏障算法(存档于此处)。

这个难题在第 31 页(基本同步模式/可重用屏障),我提出了一个(或不是)与书中解决方案(两相屏障)不同的“解决方案”。

这是我为每个线程编写的“代码”:

# n = 4; threads running
# semaphore = n max., initialized to 0
# mutex, unowned.

start:
    mutex.wait()
        counter = counter + 1
        if counter = n:
            semaphore.signal(4) # add 4 at once
            counter = 0
    mutex.release()
    semaphore.wait()
        # critical section
    semaphore.release()
goto start
Run Code Online (Sandbox Code Playgroud)

这似乎确实有效,我什至在线程的不同部分插入了不同的睡眠计时器,并且它们仍然等待所有线程到来,然后再继续每个循环。我错过了什么吗?是否有一个条件会失败?

我已经使用 Windows 库SemaphoreMutex函数实现了这一点。

更新:

感谢星蓝解答。事实证明,如果出于某种原因,线程之间的速度很慢mutex.release(),则在完整循环之后semaphore.wait()到达的任何线程semaphore.wait()都将能够再次执行,因为将留下一个N未使用的信号。 …

algorithm concurrency multithreading mutex barrier

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

在Python中将0x字符串解释为十六进制

我将一些十六进制字节附加到a中packet = [],我希望以形式返回这些十六进制字节0x__进制数据.

packet.append("2a")
packet.append("19")
packet.append("00")
packet.append("00")

packHex = []

for i in packet:
    packHex.append("0x"+i) #this is wrong

return packHex
Run Code Online (Sandbox Code Playgroud)

我该如何去有关转换('2a', '19', '00', '00')packet得到(0x2a, 0x19, 0x0, 0x0)packHex?我需要真正的十六进制数据,而不是十六进制数据的字符串.

我正在组装一个要发送的数据包pcap,pcap_sendpacket(fp,packet,len(data))其中packet应该是十六进制列表或元组,也许它可以用十进制表示,没有尝试过,我更喜欢十六进制.谢谢您的回答.

packetPcap[:len(data)] = packHex

解决了:

for i in packet: packHex.append(int(i,16))

如果需要以十六进制输出,则可以使用此命令: print ",".join(map(hex, packHex))

python types casting

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

我可以通过引用偏移指针来释放()吗?

可能重复:
传递给free()的指针是否必须指向内存块的开头,还是指向内部?

我正在使用堆在堆上分配一些内存malloc().我正在向指针添加一个偏移量并将其返回到一个调用函数return ptr+(sizeof(char)*4)),例如,该函数存储该返回值ptrReturned.

最大的问题是,当我free(ptrReturned)从分配块的开头偏移时,是否sizeof(char)*4会释放整个块,还是从偏移中释放内存直到分配块的末尾?我正在使用的编译器是MSVC++ 2008.

如果分配的地址存储在链表中,并且有指向前一项的指针,那么它应该将整个块从前一个指针为NULL的位置释放到下一个指针为NULL的位置,对吧?

我已经尝试过调试和观察内存,但我无法覆盖释放的块空间.有没有办法可以在定义的地址上显式尝试和分配堆上的空间,并且可能因尝试分配已分配的内存而获得异常?这样我就能知道,如果有的话,当然没有更简单的答案.

我希望问题很清楚,如果我遗漏了一些信息,请在评论中告诉我.谢谢.

c heap malloc free memory-management

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