由于CRC被如此广泛地使用,我很惊讶在C中找到CRC实现很困难.
对于C,是否存在"确定的"CRC计算片段/算法,"每个人"都使用?或者:是否有一个很好的CRC实现有人可以担保,并指向我?我正在寻找特别是CRC8和CRC16实现.
想想看,我的情况可能有点不同寻常.我正在为Linux编写C代码,代码最终应该移植到微控制器上.似乎一些微控制器API确实带有CRC实现; 在任何情况下,我都在寻找一个通用的软件实现(我读到CRC最初的意思是硬件实现).
我想知道CRC32 sum和CRC32C是否会回归0?给定足够大的数据集,简单的答案将是"是".但是,我想知道CRC32C标准中是否有任何配置可以明确地防止这种情况发生.
这个用例是我需要能够检查远程文件是否为空,我所拥有的是CRC32C校验和.因此,换句话说,我可以推断,如果CRC32C为0,则保证文件为空.
如果可能,请提供对定义此标准的标准的任何参考.
我们假设我有一些最后有16位校验和的数据包.我想猜猜使用了哪种校验和算法.
首先,根据转储数据,我可以看到数据包有效载荷中的一个字节更改完全改变了校验和,因此我可以假设它不是某种简单的XOR或总和.
然后我尝试了CRC16的几种变体,但没有太多运气.
这个问题可能更倾向于加密,但我真的对任何易于理解的统计工具感兴趣,以找出这可能是哪个CRC.如果其他一切都失败了,我甚至可能会转向绘制不同的CRC算法.
Backgroud故事:我有串行RFID协议,带有某种校验和.我可以毫无问题地重播消息,并解释结果(没有校验和检查),但我无法发送修改后的数据包,因为设备将它们丢弃在地板上.
使用现有的软件,我可以改变RFID芯片的有效载荷.但是,唯一的序列号是不可变的,因此我无法检查每个可能的组合.虽然我可以生成递增1的值的转储,但不足以使详尽的搜索适用于此问题.
如果问题本身不够,可以使用包含数据的转储文件 :-)
需要参考文献? CRC错误检测算法的无意义指南是我在这里提问之后找到的很好的参考.
最后,在接受了答案的非常有用的提示之后,我 使用了这个CRC计算器,并使用已知校验和的xored生成校验和得到0xffff,这使我得出结论,最终xor是CCITT的0x0000的0xffff instread.
如何计算Objective-C中NSData对象的CRC(32或64)?
提前致谢!
我正在尝试将串行端口设备集成到我的应用程序中,这需要对我发送给它的字节进行CRC-CCTT验证.我对管理字节数据包有点新意,需要帮助.
它使用此公式进行CRC演算:
[CRC-CCITT P(X)= X16 + C12 + C8 + 1]
Run Code Online (Sandbox Code Playgroud)
因此,例如对于数据包:0xFC 0x05 0x11,CRC为0x5627.然后我将此数据包发送到设备:0xFC 0x05 0x11 0x27 0x56
此外,数据包长度将在5到255之间变化(包括CRC校验字节)
我不知道如何实现这一点,所以任何想法/建议都会受到欢迎.
希望我自己清楚,先谢谢.
编辑:这是我需要做的规范:
我试图找到两个消息之间的冲突,这将导致相同的CRC哈希.考虑到我使用CRC32,有什么方法可以缩短我在进行暴力攻击时必须尝试的消息列表?
任何带有相关提示的网站链接都会有所帮助.我已经有了一个强力算法,它会做到这一点,但它只是增加整数,看它是否会匹配其他哈希值.
我知道使用CRC的全部意图是进行错误检测,但是我听到有人声称除了错误检测之外它还可以用来进行基本的纠错.如果是这样的话,我很好奇,如果是这样,它有多强大?我的意思是,我们通常将CRC称为能够执行x位检测,但我很好奇它是否能够执行x位校正.如果是这样,这是如何工作的?谢谢.
我无法理解丑陋的声音术语" 循环冗余校验 " 的概念和工作原理.我正在参加计算机网络大学课程,我已经迷路了.
麻烦的是我对数学的理解非常有限(很久以前在学校学过数学而忘记了大部分数学)我无法得到例如生成多项式到底是什么,多项式与CRC有什么关系总结一下 - 所有这些对我来说似乎完全不可理解.
我读过CRC上的wiki条目,但它对我没有帮助,因为我不擅长数学,所有这些符号和数学术语对我来说都像中文.
我知道CRC在网络上发送数据时用于错误检测但从那时起我就输了.
任何人都可以帮助我用简单的术语解释这个概念,并可能举一个例子吗?
在上一次讲座中,教授开始画出所有这些和零,分开,我不知道什么,我只是盯着和感觉愚蠢.
我很感激任何人都可以帮助我理解!
我正在尝试使用C#生成CRC-16.我用于RS232的硬件要求输入字符串为HEX.下面的屏幕截图显示了正确的转换.对于测试,我需要8000为0xC061,但是生成CRC-16的C#方法必须能够转换任何给定的HEX字符串.
我尝试过使用Nito.KitchenSink.CRC
我也尝试了以下,当输入8000时生成8009 -
public string CalcCRC16(string strInput)
{
ushort crc = 0x0000;
byte[] data = GetBytesFromHexString(strInput);
for (int i = 0; i < data.Length; i++)
{
crc ^= (ushort)(data[i] << 8);
for (int j = 0; j < 8; j++)
{
if ((crc & 0x8000) > 0)
crc = (ushort)((crc << 1) ^ 0x8005);
else
crc <<= 1;
}
}
return crc.ToString("X4");
}
public Byte[] GetBytesFromHexString(string strInput)
{
Byte[] bytArOutput = new Byte[] { };
if (!string.IsNullOrEmpty(strInput) && strInput.Length …
Run Code Online (Sandbox Code Playgroud) 我有一个基本的CRC32实现遵循维基百科的代码片段:1个样本.我认为我做得对,修改了使用n位寄存器进行余数多项式而不是n + 1位用法.
我得到的结果与在线CRC32实现结果不同.在实施中我需要更改什么?
请忽略逻辑的Console.Writeline语句.
const UInt32 poly = 0x04C11DB7;
public static UInt32 GenerateCRC_32(byte[] message)
{
byte[] augmentedMsg = new byte[message.Length + 4];
message.CopyTo(augmentedMsg, 0);
UInt32 remainder = Convert.ToUInt32(augmentedMsg[0]) << 24 |
Convert.ToUInt32(augmentedMsg[1]) << 16 |
Convert.ToUInt32(augmentedMsg[2]) << 8 |
Convert.ToUInt32(augmentedMsg[3]);
for (Int32 i = 4; i < augmentedMsg.Length; i++)
{
for (int bit = 0; bit < 8; bit++)
{
UInt32 nextBit = ((UInt32)augmentedMsg[i] >> (7 - bit)) & 0x01;
if ((remainder & 0x80000000) > 0)
{ …
Run Code Online (Sandbox Code Playgroud)