使用不同缓冲区进行CRC计算

时间:2015-07-29 11:22:07

标签: c

我正在为数据传输计算一个简单的XOR CRC。 功能是:

static char calc_crc(unsigned char *data, unsigned len)
{
    char crc = 0;
    for ( int i = 0 ; i < len; i++ )
        crc = crc ^ data[i];
    return crc;
}

我的问题是:

如何使用来自两个单独缓冲区的数据调用此函数?

E.g。

unsigned char buf1[...] = { 0x1, 0x3, 0x43, 0x1, 0x0, 0x40 }
unsigned char buf2[...] = { 0x1, 0x8, 0x44, 57, 0x00 }

我想调用我的crc函数一次,计算必须是buf1和buf2组合在一起的内容。

THX!

编辑: 正如用户Michael Walz所写,组合缓冲区将是

unsigned char bufcombined[...] = { 0x1, 0x3, 0x43, 0x1, 0x0, 0x40, 0x1, 0x8, 0x44, 57, 0x00 }

从这个缓冲区我想进行XOR计算。

3 个答案:

答案 0 :(得分:1)

  1. 首先连接缓冲区,然后调用你的函数

    这是愚蠢的,但唯一的方法就是按字面意思做出你的要求

  2. 只需调用该函数两次,如

    char crc = calc_crc(buf1, len1) ^ calc_crc(buf2, len2);
    

    这忽略了你的要求

      

    我想调用我的crc函数一次

    但你从未解释过为什么,这似乎是一个愚蠢的要求

  3. 重写函数以获取缓冲区数组和长度数组。这看起来也很愚蠢,除非你经常用iovec或其他东西来调用它

  4. 其他,更简单的做事方式......

答案 1 :(得分:0)

使用初始化参数:

#r "packages/FSharp.Data.2.2.3/lib/portable-net40+sl5+wp8+win8/FSharp.Data.dll"
#r "System.Xml.Linq"

open FSharp.Data

type XmlReqSample = XmlProvider<"sample.xml">
// file is a string of XML data
let applicant = XmlReqSample.Load(file)

let firstAddress =
  applicant.Addresses
   |> Array.tryFind (fun _ -> true)

然后你可以做result = calc_crc(calc_crc(0,buffer1,buffer1len),buffer2,buffer2len);

答案 2 :(得分:0)

你可以这样调用这个函数:

combinedcrc = calc_crc(buf1, 11);  // 11 being the sum of the lengths of buf1 and buf2

但这需要:

  1. buf2在您的问题中buf1之后直接宣布
  2. 您的编译器将buf1buf2直接一个接一个地放在内存中而不进行任何填充。通常就是这种情况,但编译器可能会在内存中以不同方式排列两个缓冲区。
  3. 从技术上讲,这是未定义的行为。