我正在为数据传输计算一个简单的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计算。
答案 0 :(得分:1)
首先连接缓冲区,然后调用你的函数
这是愚蠢的,但唯一的方法就是按字面意思做出你的要求
只需调用该函数两次,如
char crc = calc_crc(buf1, len1) ^ calc_crc(buf2, len2);
这忽略了你的要求
我想调用我的crc函数一次
但你从未解释过为什么,这似乎是一个愚蠢的要求
重写函数以获取缓冲区数组和长度数组。这看起来也很愚蠢,除非你经常用iovec
或其他东西来调用它
其他,更简单的做事方式......
答案 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
但这需要:
buf2
在您的问题中buf1
之后直接宣布buf1
和buf2
直接一个接一个地放在内存中而不进行任何填充。通常就是这种情况,但编译器可能会在内存中以不同方式排列两个缓冲区。从技术上讲,这是未定义的行为。