我正在尝试计算/验证压缩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(你得到我的观点) …
我正在尝试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从返回WriteConsole到STD_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 …
我正在研究“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 库Semaphore和Mutex函数实现了这一点。
感谢星蓝的解答。事实证明,如果出于某种原因,线程之间的速度很慢mutex.release(),则在完整循环之后semaphore.wait()到达的任何线程semaphore.wait()都将能够再次执行,因为将留下一个N未使用的信号。 …
我将一些十六进制字节附加到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))
我正在使用堆在堆上分配一些内存malloc().我正在向指针添加一个偏移量并将其返回到一个调用函数return ptr+(sizeof(char)*4)),例如,该函数存储该返回值ptrReturned.
最大的问题是,当我free(ptrReturned)从分配块的开头偏移时,是否sizeof(char)*4会释放整个块,还是从偏移中释放内存直到分配块的末尾?我正在使用的编译器是MSVC++ 2008.
如果分配的地址存储在链表中,并且有指向前一项的指针,那么它应该将整个块从前一个指针为NULL的位置释放到下一个指针为NULL的位置,对吧?
我已经尝试过调试和观察内存,但我无法覆盖释放的块空间.有没有办法可以在定义的地址上显式尝试和分配堆上的空间,并且可能因尝试分配已分配的内存而获得异常?这样我就能知道,如果有的话,当然没有更简单的答案.
我希望问题很清楚,如果我遗漏了一些信息,请在评论中告诉我.谢谢.