//我也没有测试 //斑竹大人为何不给个输入输出范例 function packToBCD(strSrc: PChar; len: Integer; strBCD: PByte): PByte; //BYTE *packToBCD(char *strSrc, int len, BYTE *strBCD) var I: Integer;//int i; pSrc: PChar;//char *pSrc; pStr: PByte;//BYTE *pStr; begin pSrc := strSrc;//pSrc = strSrc; pStr := strBCD;//pStr = strBCD; while I < len do begin//for (i=0; i<len; i+=2) if pSrc^ = #0 then begin//if (*pSrc == '\0') Inc(pStr); pStr^ := $FF;//*pStr++ = (char)0xFF; Inc(I, 2); Break;//break; end else if ((pSrc + 1)^ = #0) or (I + 1 = len) then begin//else if (*(pSrc+1) == '\0' || i+1 == len) Inc(pStr); pStr^ := (Ord(pSrc^) and $F) * 16 + $F;//*pStr++ = (*pSrc&0xF)*16 + 0xF; Inc(I, 2); Break;//break; end else begin Inc(pStr); pStr^ := (Ord(pSrc^) and $F) * 16 + Ord(pSrc^) + 1 and $F;//*pStr++ = (*pSrc&0xF)*16 + (*(pSrc+1)&0xF); Inc(pSrc, 2);//pSrc += 2; end; Inc(I, 2); end; Result := strBCD; end;
pStr^ := (Ord(pSrc^) and $F) * 16 + (Ord(pSrc^ + 1) and $F);//*pStr++ = (*pSrc&0xF)*16 + (*(pSrc+1)&0xF); // ~~~~~~~~~~~~~~~~~~~~~~~~
不是很熟,可能很多错,呵呵function PackToBCD(Buffer: PChar; Len: Integer; BCD: PChar); var I: Integer; P: PChar; C: Char; begin P := Buffer; Result := BCD; for I := 0 to Len - 1 step 2 do begin C := P[I]; if C = 0 then begin P[I + 1] := 255; break; end else if (P[I + 1] = 0) and (I + 1 = Len) then begin P[I + 1] := (Ord(C) and $F) * 16 + $F; break; end else begin P[I + 1] := (Ord(C) and $F) * 16 + (Ord(P[I + 1) and $F); Inc(P, 2); end; end; end;procedure Button1OnClick(Sender: TObject); var S: string; I: Integer; pTemp: PChar; Str: array [0..12] of Char; begin GetMem(pTemp, 12); try for I := 0 to 12 do Str[I] := I; PackToBCB(@Str[0], 12, pTemp); S := ''; for I := 0 to 12 do S := S + Format('%d', [pTemp[I]]); //UpdateData(); how do do? Edit.Text := S; finally FreeMem(pTemp); end; end;
//斑竹大人为何不给个输入输出范例
function packToBCD(strSrc: PChar; len: Integer; strBCD: PByte): PByte;
//BYTE *packToBCD(char *strSrc, int len, BYTE *strBCD)
var
I: Integer;//int i;
pSrc: PChar;//char *pSrc;
pStr: PByte;//BYTE *pStr;
begin
pSrc := strSrc;//pSrc = strSrc;
pStr := strBCD;//pStr = strBCD; while I < len do begin//for (i=0; i<len; i+=2)
if pSrc^ = #0 then begin//if (*pSrc == '\0')
Inc(pStr);
pStr^ := $FF;//*pStr++ = (char)0xFF;
Inc(I, 2);
Break;//break;
end else if ((pSrc + 1)^ = #0) or (I + 1 = len) then begin//else if (*(pSrc+1) == '\0' || i+1 == len)
Inc(pStr);
pStr^ := (Ord(pSrc^) and $F) * 16 + $F;//*pStr++ = (*pSrc&0xF)*16 + 0xF;
Inc(I, 2);
Break;//break;
end else begin
Inc(pStr);
pStr^ := (Ord(pSrc^) and $F) * 16 + Ord(pSrc^) + 1 and $F;//*pStr++ = (*pSrc&0xF)*16 + (*(pSrc+1)&0xF);
Inc(pSrc, 2);//pSrc += 2;
end;
Inc(I, 2);
end;
Result := strBCD;
end;
// ~~~~~~~~~~~~~~~~~~~~~~~~
var
I: Integer;
P: PChar;
C: Char;
begin
P := Buffer;
Result := BCD;
for I := 0 to Len - 1 step 2 do
begin
C := P[I];
if C = 0 then
begin
P[I + 1] := 255;
break;
end else
if (P[I + 1] = 0) and (I + 1 = Len) then
begin
P[I + 1] := (Ord(C) and $F) * 16 + $F;
break;
end else
begin
P[I + 1] := (Ord(C) and $F) * 16 + (Ord(P[I + 1) and $F);
Inc(P, 2);
end;
end;
end;procedure Button1OnClick(Sender: TObject);
var
S: string;
I: Integer;
pTemp: PChar;
Str: array [0..12] of Char;
begin
GetMem(pTemp, 12);
try
for I := 0 to 12 do Str[I] := I;
PackToBCB(@Str[0], 12, pTemp);
S := '';
for I := 0 to 12 do
S := S + Format('%d', [pTemp[I]]);
//UpdateData(); how do do?
Edit.Text := S;
finally
FreeMem(pTemp);
end;
end;