求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; 展开
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; 展开
1个回答
展开全部
你提供的程序是没有主程序的,所以转换之后的代码也不能作为独立程序编译运行。
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;
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询