BYTE TempBuf[512];
USHORT iCRC;
//声明
iCRC = ClaCRC(TempBuf, 12);
memcpy(TempBuf+12, &iCRC, 2);
//调用unsigned short int ClaCRC(BYTE* lpBuf,int DataLen)
{
unsigned short int CRC_Code = 0;
BOOL IsHI;
int i;
DataLen += 2;
for(;DataLen > 0;DataLen --)
{
for(i = 0x80; i != 0; i >>= 1)
{
if((CRC_Code & 0x8000) > 0)
{
IsHI = TRUE;
}
else
{
IsHI = FALSE;
}
CRC_Code <<= 1;
if((DataLen > 2) && ((*lpBuf & i) == i))
CRC_Code |= 0x0001;
if(IsHI)
CRC_Code ^= 0x1021;
}
lpBuf++;
}
return(CRC_Code);
}上面的VC代码在Delphi中该怎么表示呀
请求各位帮帮忙,不胜感激!
USHORT iCRC;
//声明
iCRC = ClaCRC(TempBuf, 12);
memcpy(TempBuf+12, &iCRC, 2);
//调用unsigned short int ClaCRC(BYTE* lpBuf,int DataLen)
{
unsigned short int CRC_Code = 0;
BOOL IsHI;
int i;
DataLen += 2;
for(;DataLen > 0;DataLen --)
{
for(i = 0x80; i != 0; i >>= 1)
{
if((CRC_Code & 0x8000) > 0)
{
IsHI = TRUE;
}
else
{
IsHI = FALSE;
}
CRC_Code <<= 1;
if((DataLen > 2) && ((*lpBuf & i) == i))
CRC_Code |= 0x0001;
if(IsHI)
CRC_Code ^= 0x1021;
}
lpBuf++;
}
return(CRC_Code);
}上面的VC代码在Delphi中该怎么表示呀
请求各位帮帮忙,不胜感激!
解决方案 »
- Delphi中怎么用正则表达式
- 我写了一个双色球分析软件
- 编译时出现‘symbol 'TRzToolbarButton' is deprecated’的错误提示,是什么意思 ?
- 急求救,编译后程序运行弹出的警告!!!
- 怎么根据条件让LISTVIEW中的字体改变颜色?
- —————如何重用编辑数据窗体?分不够再加!————
- 有没有什么函数可以得到硬盘的分几个区,并且得到每个盘符呢?
- 不行了,请教各位,关于tp在图形方面的应用。
- 请教一个关于ADOConnection控件属性设置的问题,谢谢!
- out关键字有何用??
- 怎样判断一个mdichild窗口是否获得了焦点?
- 发布一款多sheet、支持xml、导出excel、能够用于AJAX技术的、免费的、高品质的Grid控件!
iCRC: BYTE;
//声明
iCRC := ClaCRC(TempBuf, 12);
Move(iCRC, TempBuf[12], 2);
//调用function ClaCRC(lpBuf: PBYTE; DataLen: INteger):BYTE;
var
CRC_Code : BYTE;//= 0;
IsHI: BOOL;
i: Integer;
begin
CRC_CODE := 0;
Inc(DataLen, 2); for DataLen := DataLen to 1 do
begin
i := $80;
while (i<> 0 ) do//i = 0x80; i != 0; i >>= 1)
begin
if((CRC_Code and $8000) > 0)then
begin
IsHI := TRUE;
end
else
begin
IsHI := FALSE;
end
CRC_Code := CRC_Code shl 1;//<<= 1;
if((DataLen > 2) and ((lpBuf^ and i) = i))then
CRC_Code := CRC_Code or $0001;
if(IsHI)then
CRC_Code := CRC_COde xor $1021;//^= 0x1021;
end;
Inc(lpBuf);
i := i shr 1;
end;
result :=CRC_Code;
end;
var
IsHi:boolean;
i:integer;
CRC_code:word;
p:^byte;
begin
p:=@lpbut[1];
CRC_code:=0;
for DataLen:=DataLen+2 downto 1 do
begin
i:=$80;
while (i<>0) do
begin
if((CRC_code and $8000)>0) then
IsHi:=True
else
IsHi:=False;
CRC_code:=CRC_code shl 1;
if((DataLen>2) and ((p^ and i)=i)) then
CRC_code:=CRC_code or $0001;
if(IsHi) then
CRC_code:=CRC_code xor $1021;
i:=i shr 1;
end;
inc(p);
end; Result:=CRC_code;
end;这是我自已改的。可以编译运行的,帮忙看看意思有没有变动。
感谢大家的关注和回复。
楼上的谢谢你,不过你的代码我在编译时有问题。可能是我调用的方式和你不同吧。
CRCValue:=Fcomm.claCRC(sbuf,10); 我的调用是这样弄的,是不是和你的有区别,还烦请告之!
//声明
BYTE DataBuf[512];
BYTE TempBuf[512];
int DataLen,TempLen;
//调用
TorF=AssicDeComp((char*)DataBuf,&DataLen,TempBuf,TempLen);BOOL AssicDeComp(char* lpDest, int* lpDestLen, BYTE* lpSour, int SourLen)
{
int i, iTemp;
BYTE cTemp;
if((SourLen * 2) > *lpDestLen) return(FALSE);
iTemp = 0; //whb *lpDestLen=512;
for(i = 0; i < SourLen; i++)
{
cTemp = *(lpSour + i);
cTemp >>= 4;
if(cTemp >= 0x0A) //高位
{
*(lpDest + iTemp) = cTemp + 0x37;
}
else
{
*(lpDest + iTemp) = cTemp + 0x30;
}
iTemp++;
cTemp = *(lpSour + i);
cTemp &= 0x0F; //低位
if(cTemp >= 0x0A)
{
*(lpDest + iTemp) = cTemp + 0x37;
}
else
{
*(lpDest + iTemp) = cTemp + 0x30;
}
iTemp++;
}
*(lpDest + iTemp) = NULL;
*lpDestLen = iTemp;
return(TRUE);
}
如果是array of byte就按你的来吧我是按照原型ClaCRC(BYTE* lpBuf,int DataLen)来声明的TempBuf: Array [0..512-1] of BYTE;
不过调用的时候写错了:
iCRC := ClaCRC(TempBuf, 12);
应该是:
iCRC := ClaCRC(@TempBuf[0], 12);
感谢您的回复,和您说的意思是一样的。
能麻烦您帮忙转换一下上面的哪段VC代码吗,我转换之后感觉是错误的,功能和上面的不一样。
再次表示感谢!