请帮忙转个C写的函数 ( 积分: 100 )

  • 主题发起人 主题发起人 bluedyness
  • 开始时间 开始时间
B

bluedyness

Unregistered / Unconfirmed
GUEST, unregistred user!
有个C写的函数 如果哪位大虾有空请帮忙转成Delphi的 不胜感激!

新世纪前辈已帮我弄好了 感谢大家百忙中赏脸来看我帖子 谢谢所有浏览过帖子的朋友 谢谢大家
 
麻烦看看
 
function crc_16(buf:string,size:integer):integer;
var
i:integer;
crc:integer;
begin
while size-i<>0
end;

function CRC_16(Buf: PChar; Size: Byte): Cardinal;
var
I: Char;
CRC: Cardinal;
begin
CRC := 0;
while Size > 0 do
begin
for I : ....这里怎么写???

begin
if (CRC and $8000) <> 0 then
begin
crc := crc * 2;
crc....这里怎么写???
end;
Dec(Size);
end;
end;
 
crc^=0x1921
应该是
crc:= crc not $1921;
吧?
 
// 非常简单的, 首先你要熟悉Delphi本身, 例如pchar的使用等...,
// 再者, 如果要真的做个程序员, 还必须懂C,C++, 毕竟C,C++资源很多, 虽然C是头脑发昏的人发明的, 但还是有很多头脑发昏的人在用;
function crc_16(buf : pchar; size : byte) : dword; // or cardinal;
var i : byte;
crc : dword;
begin
crc := 0;
while (size <> 0) do
begin
dec(size);
i := $80;
while (i<>0) do
begin
i := i / 2; // i := i shr 1; 速度优化
crc := 2 * crc; // crc := crc shl 1; 速度优化
if ((crc and $8000) <> 0) then crc := crc or $1921;
if ((byte(buf^) and i) <> 0) then crc := crc or $1921;
end;
inc(buf);
end;
result := crc;
end;
 
谢谢楼上的两位前辈
to 新世纪
var s:string;
begin
s:='12345678';
showmessage(inttostr(crc_16(pchar(s),8));
无论我把s改成任何字符串show出来的都是4294967295 也就是FFFFFFFF 请问是哪里问题??
哎!人有点笨,没办法!
 
//对不起,上面的代码有3个错误,更新如下:
function crc_16(buf : pchar; size : byte) : dword; // or cardinal;
var i : byte;
crc : dword;
begin
crc := 0;
while (size <> 0) do
begin
dec(size);
i := $80;
while (i<>0) do
begin
if ((crc and $8000) <> 0) then
begin
crc := 2 * crc; // 错误1: 必须这样写, 对照前面的代码, 你自己看看为什么?
crc := crc xor $1921; // 错误2: 应该是 xor 不是 or
end else crc := 2 * crc;
if ((byte(buf^) and i) <> 0) then crc := crc xor $1921;
i := i div 2; // 错误3: 错误类型同错误1
end;
inc(buf);
end;
result := crc;
end;
 
谢谢阿 测试通过了 真的非常感谢你新世纪前辈 我看过你的一些帖子 久仰了!
你说的那个几个错误我也曾留意到一些 如果你刚刚一直在留意我的帖子的话你就会发现我重新编辑了帖子了 本来是打算贴出来问你的 但是又对自己没有信心 又删掉了 哎...我刚刚是这样改的:
begin
crc := 0;
while (size <> 0) do
begin
dec(size);
i := $80;
while (i<>0) do
begin
crc := 2 * crc; // crc := crc shl 1; 速度优化
if ((crc and $8000) <> 0) then crc:= crc xor $1921
else crc := 2 * crc;
if ((byte(buf^) and i) <> 0) then crc:= crc xor $1921;
i := i div 2; //i := i shr 1; 速度优化
end;
inc(buf);
end;
result := crc;
end;
最后还是要再说声谢谢! 我是修硬件的半路出家的 基础太差了 要学的东西还很多 受教了!
 
多人接受答案了。
 
后退
顶部