我有一个 rar 文件,它是文件的集合。我已经使用 python 代码在 rar 文件上生成了 MD5 校验和,如下所示,然后假设 rar 文件生成的 md5 是 XXX。当我刚刚提取 rar 文件(没有修改/添加文件)并再次创建 rar 文件时,我观察到校验和已更改(除 XXX 之外)。
import hashlib
hashlib.md5("filename.rar").hexdigest()
Run Code Online (Sandbox Code Playgroud)
有没有像 CRC、校验和、SHA1 等算法,即使文件日期/时间发生变化并且文件的实际内容没有变化,计算出的校验和仍然相同?
我正在使用x-modem协议和133字节数据包从serialport读取文件.我在读那个
1 byte is SOH
2 byte packet number
3 byte nagative of packet number
next 128 bytes data
2 bytes CRC sent from other side.
Run Code Online (Sandbox Code Playgroud)
我必须计算128字节数据的CRC和从另一侧发送的2字节crc,我必须使其成为单字节,并且必须与我计算的crc共同计算.我怎么能在java中这样做?
我在Delphi 5和2010中使用了相同的函数(OneWayEncrypt(edit1.Text)).
为什么结果不同?(或者我如何从Delphi 2010中获得相同的结果?)
uses Sysutils, Windows, Dialogs, classes;
function OneWayEncrypt(AStr: string): string;
PROCEDURE CalcCRC32 (p: pointer; ByteCount: DWORD; VAR CRCvalue: DWORD);
implementation
const
table: ARRAY[0..255] OF DWORD =
(
//table consts are here
);
PROCEDURE CalcCRC32(p: pointer; ByteCount: DWORD; VAR CRCvalue: DWORD);
VAR
i: DWORD;
q: ^Byte;
BEGIN
q := p;
FOR i := 0 TO ByteCount - 1 DO
BEGIN
CRCvalue := (CRCvalue SHR 8) XOR table[q^ XOR (CRCvalue AND $000000FF)];
INC(q);
END
END;
function OneWayEncrypt(AStr: …Run Code Online (Sandbox Code Playgroud) 我需要在大文件上用$ 1021多项式计算Crc16校验和,下面是我当前的实现,但是在大文件上它相当慢(例如90 MB文件大约需要9秒).
所以我的问题是如何改进我当前的实现(使其更快),我用Google搜索并查看了一些实现表查找的示例但我的问题是我不明白如何修改它们以包含多项式(可能是我的数学失败了).
{ based on http://miscel.dk/MiscEl/CRCcalculations.html }
function Crc16(const Buffer: PByte; const BufSize: Int64;
const Polynom: WORD=$1021; const Seed: WORD=0): Word;
var
i,j: Integer;
begin
Result := Seed;
for i:=0 to BufSize-1 do
begin
Result := Result xor (Buffer[i] shl 8);
for j:=0 to 7 do begin
if (Result and $8000) <> 0 then
Result := (Result shl 1) xor Polynom
else Result := Result shl 1;
end;
end;
Result := Result and $FFFF;
end;
Run Code Online (Sandbox Code Playgroud) 我有一些我需要测试的CRC方法.这些方法不是我自己写的.我能看到的最好方法是使用不同的技术实现CRC算法,然后比较结果.
目前,所有CRC例程都是以表驱动格式编写的.我似乎无法找到任何教程解释如何将代码转换为按位实现.我确信这是我对CRC的工作方式缺乏了解.
如果某人可以提供相同CRC例程的示例,则可以采用两种不同的方式实现.我在互联网上搜索过,并没有找到太多帮助我的问题.
以下是我需要测试的一种CRC算法的示例代码:
// This table implements the EPO CRC16 algorithm with a polynomial of 0x17531
static const uint16 s_EPOCRC16Table[] =
{
0x0000U, 0x7531U, 0xEA62U, 0x9F53U, 0xA1F5U, 0xD4C4U, 0x4B97U, 0x3EA6U,
0x36DBU, 0x43EAU, 0xDCB9U, 0xA988U, 0x972EU, 0xE21FU, 0x7D4CU, 0x087DU,
0x6DB6U, 0x1887U, 0x87D4U, 0xF2E5U, 0xCC43U, 0xB972U, 0x2621U, 0x5310U,
0x5B6DU, 0x2E5CU, 0xB10FU, 0xC43EU, 0xFA98U, 0x8FA9U, 0x10FAU, 0x65CBU,
0xDB6CU, 0xAE5DU, 0x310EU, 0x443FU, 0x7A99U, 0x0FA8U, 0x90FBU, 0xE5CAU,
0xEDB7U, 0x9886U, 0x07D5U, 0x72E4U, 0x4C42U, 0x3973U, 0xA620U, 0xD311U,
0xB6DAU, 0xC3EBU, 0x5CB8U, 0x2989U, 0x172FU, 0x621EU, 0xFD4DU, 0x887CU,
0x8001U, …Run Code Online (Sandbox Code Playgroud) 以太网帧校验序列始终附加到数据链路层中帧的末尾.为什么它被附加到帧的末尾而不是其他地方?
我考虑过它并认为它可能与如何计算CRC校验和有关,如果帧的结构是头+有效载荷+ crc而不是header + crc + payload,则更容易由硬件执行.
CRC执行形式(数据+填充)/除数的XOR除法,对于最终帧,填充由余数替换.接收器然后计算(数据+余数)/除数,并在结果为0时接受帧.
可能重复:
PHP8中的CRC8-Check
有没有好的PHP 8bit CRC生成?我搜索过,找不到任何好的消息来源.我发现了16位:
function crc16($string) {
$crc = 0xFFFF;
for ($x = 0; $x < strlen ($string); $x++) {
$crc = $crc ^ ord($string[$x]);
for ($y = 0; $y < 8; $y++) {
if (($crc & 0x0001) == 0x0001) {
$crc = (($crc >> 1) ^ 0xA001);
} else { $crc = $crc >> 1; }
}
}
return $crc;
}
Run Code Online (Sandbox Code Playgroud) public static int getCRC16(byte[] bytes) {
CRC16 crc = new CRC16();
crc.reset();
crc.update(bytes, 0, bytes.length);
return (int) crc.getValue();
}
Run Code Online (Sandbox Code Playgroud)
大量的线程会遇到这种方法,如果我不同步我会对crc特定的线程出错吗?
我正在逐位计算CCITT CRC-16.我这样做是因为它是一个原型,以后应该移植到VHDL并最终在硬件中检查串行比特流.
在网上我发现了一位CRC-16更新步骤代码.写了一个测试程序,它的工作原理.除了一个奇怪的事情:我必须从最低位到最高位提供一个字节的位.如果我这样做,我会得到正确的结果.
在CRCITT的CCITT定义中,位应该是最高位到最低位.我想要计算CRC的数据流也是这种格式的,所以我现在的代码对我来说没什么用.
我糊涂了.我不希望以错误的方式喂食这些钻头可能会起作用.
问题:为什么可以编写CRC来以两个不同的位顺序获取数据,以及如何转换它首先接受数据MSB的单位更新代码?
作为参考,这是相关代码.已删除初始化和最终检查以保持示例简短:
typedef unsigned char bit;
void update_crc_single_bit (bit * crc, bit data)
{
// update CRC for a single bit:
bit temp[16];
int i;
temp[0] = data ^ crc[15];
temp[1] = crc[0];
temp[2] = crc[1];
temp[3] = crc[2];
temp[4] = crc[3];
temp[5] = data ^ crc[4] ^ crc[15];
temp[6] = crc[5];
temp[7] = crc[6];
temp[8] = crc[7];
temp[9] = crc[8];
temp[10] = crc[9];
temp[11] = crc[10];
temp[12] = data ^ crc[11] ^ crc[15];
temp[13] …Run Code Online (Sandbox Code Playgroud) 我在Ubuntu 14.0.4中使用GNU C. 我编写了一个CRC_XOR()函数,并使用相同的输入参数多次调用它.但它很奇怪,每次通话有时会得到不同的结果.出了什么问题?示例代码在这里:
#include <stdio.h>
#include <stdlib.h>
char CRC_XOR(char *as_Pkt,int ai_len);
void DO_Get_CRC(void);
int main(void)
{
DO_Get_CRC(); //get 01 00 02 03
DO_Get_CRC(); //get 01 00 02 03
DO_Get_CRC(); //get 01 00 02 00 (strange?)
DO_Get_CRC(); //get 01 00 02 03
DO_Get_CRC(); //get 01 00 02 00 (strange?)
DO_Get_CRC(); //get 01 00 02 03
DO_Get_CRC(); //get 01 00 02 00 (strange?)
exit(0);
}
/*
use same input to invoke CRC_XOR()
*/
void DO_Get_CRC(void)
{
char ls_pkt[20];
int li_idx;
short …Run Code Online (Sandbox Code Playgroud)