当前位置: 代码迷 >> PB >> 一段C语言加密字符串转换为pb,得到的结果不对
  详细解决方案

一段C语言加密字符串转换为pb,得到的结果不对

热度:91   发布时间:2016-04-29 08:10:55.0
一段C语言加密字符串转换为pb,得到的结果不对,求助
c源代码:
int jiami(char *source,char *target)
{
unsigned char def_str[18]={1,9,7,4,1,0,2,1,1,9,7,4,'0',3,3,'0',0};
unsigned char temp1[18];
unsigned int i,len;

unsigned char x=0;

strcpy((char *)temp1,source);
len=strlen((char *)temp1);
for(i=len;i<16;i++)
temp1[i]=0;
for(i=0;i<16;i++)
temp1[i]=temp1[i]^def_str[i];

for(i=0;i<16;i++)
x=x+temp1[i];

temp1[0]=temp1[0]+x;
for(i=1;i<16;i++)
{
temp1[i]=temp1[i-1]+temp1[i]+x;
x=temp1[i-1]+temp1[i];
}
temp1[0]=temp1[15]+temp1[0]+x;
for(i=0;i<16;i++)
{
if(temp1[i]>126)
temp1[i]=temp1[i]-126;
if(temp1[i]>126)
temp1[i]=temp1[i]-126;
if(temp1[i]<=32)
temp1[i]=temp1[i]+33;
}
temp1[16]=0;
strcpy(target,(char *)temp1);
return 0;
}

我翻译的pb函数,其中mm是当作行数的参数输入:
Int def_str[18] = {1,9,7,4,1,0,2,1,1,9,7,4,0,3,3,0,0}
Int temp1[18]
Int i,Len,j

String ls_return

Long X = 0

//strcpy((char *)temp1,source);
//len=strlen((char *)temp1);
Len = Len(mm)

FOR j = 1 To Len
temp1[j] = asc(Mid(mm,j,1))
NEXT

//For(i = Len;i < 16;i++)
FOR i = Len+1 To 16
temp1[i] = 0
NEXT

//For(i = 0;i < 16;i++)
FOR i = 1 To 16
temp1[i] = temp1[i]^def_str[i]
NEXT
//For(i = 0;i < 16;i++)

FOR i = 1 To 16
X = X+Long(temp1[i])
NEXT

temp1[1] = temp1[1]+X

//For(i = 1;i < 16;i++)
FOR i = 2 To 16
temp1[i] = temp1[i-1]+temp1[i]+X;
X = temp1[i-1]+temp1[i];
NEXT

temp1[1] = temp1[16]+temp1[1]+X;
//For(i = 0;i < 16;i++)
FOR i = 1 To 16
If(temp1[i] > 126) THEN
temp1[i] = temp1[i]-126

ElseIf(temp1[i] > 126) THEN
temp1[i] = temp1[i]-126

ElseIf(temp1[i] <= 32) THEN
temp1[i] = temp1[i]+33

END IF

NEXT
temp1[17] = 0;

//strcpy(target,(char *)temp1);

FOR i = 1 To 16
ls_return = ls_return+Char(temp1[i] )
NEXT

RETURN ls_return

得到的加密后的字符串不一致,求助


------解决方案--------------------
这样转换不行吧。 C中是地址,转换成pb中的话,一般我们用的是byte。 pb中的精度值跟c的差别有点大。 建议自己采用pb的方式进行加密。
------解决方案--------------------
那你还不如把C语言的代码编译成dll或pbx供PB调用
------解决方案--------------------
楼上的方法可以。
  相关解决方案