我需要生成一个4字节的校验和,它被定义为某个二进制数据的“32位按位异或否定值”。我正在为Erlang中的计费系统重写某个MML接口的编码/解码部分。
此类功能的C / C ++版本如下:
Function: GetChkSum
Description:
A 32-bit bitwise Exclusive-OR negation value of "message header
+ session header + transaction header + operation information".
Input:
len indicates the total length of "message header + session header
+ transaction header + operation information".
Buf indicates the string consisting of message header, session header,
transaction header, and operation information.
Output: res indicates the result of the 32-bit bitwise Exclusive-OR negation
value
void GetChkSum(Int len, PSTR buf, PSTR res)
{
memset(res, 0, MSG_CHKSUM_LEN);
for(int i=0; i<len; i+=4)
{
res[0]^=(buf+i)[0];
res[1]^=(buf+i)[1];
res[2]^=(buf+i)[2];
res[3]^=(buf+i)[3];
};
res[0]=~res[0];
res[1]=~res[1];
res[2]=~res[2];
res[3]=~res[3];
};
我需要在Erlang中重写它。我怎么能这样做?
答案 0 :(得分:1)
在erlang中执行xor没有困难(要使用的运算符是bxor并使用整数)。但要编写任何代码,您需要定义&#34;格式&#34;首先是输入和输出从你的例子我猜它可能是ascii代码,存储在二进制文件中,或字符串??
定义输入类型后,可以使用以下类型的函数评估结果:
negxor(<<>>,R) -> int_to_your_result_type(bnot(R) band 16#FFFFFFFF);
negxor(<<H:32,Q:binary>>,R) -> negxor(Q,R bxor H).
您可以使用negxor(your_input_to_binary(Input),0)
调用它。