求Delphi代码转C/C++或C#或易语言都可以,谢谢!

_Buffer=PackedRecordHead:Byte;//头标志Len:Byte;//包长度end;constc_key:array[0..31]ofbyte=($... _Buffer = Packed Record
Head:Byte; //头标志
Len:Byte; //包长度
end;
const
c_key :array [0..31] of byte = ($AB,$11,$CD,$FE,$18,$23,$C5,$A3,$CA,$33,
$C1,$CC,$66,$67,$21,$F3,$32,$12,$15,$35,
$29,$FF,$FE,$1D,$44,$EF,$CD,$41,$26,$3C,
$4E,$4D);//key密钥

//加密 参数:IN OUT数据源, IN长度 返回:加密长度
function MyEncode(Buffer: Pointer;Len: Integer): Integer;
var
Src:pbyte;
i,j:Integer;
x:byte;
begin
Src:=Buffer;
if Src^ = $C1 then
begin
Inc(Src);
Inc(Src);
x:=Src^;
Inc(Src);
for i := 3 to Len - 1 do
begin
j:=i and $8000001F;
Src^:=Src^ xor x xor c_key[j];
x:=Src^;
Inc(Src);
end;
Result:=Len;
end
else
Result:=-1;
end;

//解密 参数:IN OUT数据源, IN长度 返回:解密长度
function MyDecode(Buffer: Pointer; Len: Integer): Integer;
var
Src:array [0..100] of byte;
i:Integer;
begin
CopyMemory(@Src,Buffer,Len);
if Src[0] = $C1 then
begin
for i := Len - 1 downto 3 do
begin
Src[i]:=Src[i] xor Src[i-1] xor c_key[i];
end;
Result:=Len;
CopyMemory(Buffer,@Src,Len);
end
else
Result:=-1;
end;
展开
 我来答
艾萨克7NT
推荐于2016-02-29 · 超过33用户采纳过TA的回答
知道答主
回答量:46
采纳率:0%
帮助的人:32.2万
展开全部

你提供的程序是没有主程序的,所以转换之后的代码也不能作为独立程序编译运行。

C/C++语言

#include <string.h>
#define  byte unsigned char

struct tag_Buffer
{
    byte    Head;   //  头标志 
    byte    Len;    //  包长度 
};
typedef struct tag_Buffer _Buffer;

byte c_key[32] = { 
    0xAB, 0x11, 0xCD, 0xFE, 0x18, 0x23, 0xC5, 0xA3, 0xCA, 0x33,
    0xC1, 0xCC, 0x66, 0x67, 0x21, 0xF3, 0x32, 0x12, 0x15, 0x35,
    0x29, 0xFF, 0xFE, 0x1D, 0x44, 0xEF, 0xCD, 0x41, 0x26, 0x3C,
    0x4E, 0x4D};    //  key密钥

//  加密    参数:IN OUT数据源, IN长度  返回:加密长度
int MyEncode(void *Buffer, int Len)
{
    byte    *Src;
    int     i, j;
    byte    x;
    int     Result;
    
    Src =   (byte *)Buffer;
    if (*Src == 0xC1)
    {
        Src ++;
        Src ++;
        x   =   *Src;
        Src ++;
        for (i = 3; i <= Len - 1; i++)
        {
            j   =   i & 0x8000001F;
            *Src=   *Src ^ x ^ c_key[j];
            x   =   *Src;
            Src ++;
        }
        Result  =   Len;
    }
    else
        Result  =   -1;
    return  Result;
}

//  解密    参数:IN OUT数据源, IN长度  返回:解密长度
int MyDecode(void *Buffer, int Len)
{
    byte    Src[101];
    int     i;
    int     Result;
    
    memcpy(Src, Buffer, Len);
    if (Src[0] == 0xC1)
    {
        for (i = Len-1; i>=3; i--)
        {
            Src[i] = Src[i] ^ Src[i-1] ^ c_key[i];
        }
        Result  =   Len;
        memcpy(Buffer, Src, Len);
    }
    else
        Result  =   -1;
    return  Result;
}

此代码在gcc/g++ 4.9.2版本编译通过(需要额外添加main函数)。

在C++中,由于C++语言的特性

建议将

int MyEncode(void *Buffer, int Len)


int MyDecode(void *Buffer, int Len)

修改为

int MyEncode(void *Buffer, const int &Len)
int MyDecode(void *Buffer, const int &Len)

通过严格的限制其IN特征来提高代码效率。

追问
  非常感谢,解密OK.
int main()
{
void* buffer=NULL;
byte buf[6] = { 193, 6, 16, 208, 261, 136 };
int Len = MyDecode(buf, 6);
printf("result:Len = %d", Len);

return 0;
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式