function CharToBinString(chs: pchar): pchar; 
var 
  ii: Integer; 
  i:integer; 
  ch:char; 
  rtnpchar:pchar 
begin 
  GetMem(Result,length(chs) + 1); 
  GetMem(rtnpchar,length(chs) + 1); 
  Result := '00000000'; 
for i:= 0 To length(ch) -1 
begin 
  ch := chs[i]; 
  for ii := 7 downto 0 do 
  if Ord(ch) AND (1 shl ii) > 0 then 
  Result[8 - ii] := '1'; 
  strcat(rtnpchar,Result); 
end; 
  Result:= rtnpchar; 
end; 
老是走到 Result[8 - ii] := '1'; 就报错。

解决方案 »

  1.   

    function ToBinaryText(const Value: AnsiString): AnsiString;
    const Const_8BIT_BINARY_TEXT : array [0..255] of AnsiString =
      ( '00000000', '00000001', '00000010', '00000011', '00000100', '00000101','00000110','00000111',
        '00001000', '00001001', '00001010', '00001011', '00001100', '00001101','00001110','00001111',
        '00010000', '00010001', '00010010', '00010011', '00010100', '00010101','00010110','00010111',
        '00011000', '00011001', '00011010', '00011011', '00011100', '00011101','00011110','00011111',
        '00100000', '00100001', '00100010', '00100011', '00100100', '00100101','00100110','00100111',
        '00101000', '00101001', '00101010', '00101011', '00101100', '00101101','00101110','00101111',
        '00110000', '00110001', '00110010', '00110011', '00110100', '00110101','00110110','00110111',
        '00111000', '00111001', '00111010', '00111011', '00111100', '00111101','00111110','00111111',
        '01000000', '01000001', '01000010', '01000011', '01000100', '01000101','01000110','01000111',
        '01001000', '01001001', '01001010', '01001011', '01001100', '01001101','01001110','01001111',
        '01010000', '01010001', '01010010', '01010011', '01010100', '01010101','01010110','01010111',
        '01011000', '01011001', '01011010', '01011011', '01011100', '01011101','01011110','01011111',
        '01100000', '01100001', '01100010', '01100011', '01100100', '01100101','01100110','01100111',
        '01101000', '01101001', '01101010', '01101011', '01101100', '01101101','01101110','01101111',
        '01110000', '01110001', '01110010', '01110011', '01110100', '01110101','01110110','01110111',
        '01111000', '01111001', '01111010', '01111011', '01111100', '01111101','01111110','01111111',
        '10000000', '10000001', '10000010', '10000011', '10000100', '10000101','10000110','10000111',
        '10001000', '10001001', '10001010', '10001011', '10001100', '10001101','10001110','10001111',
        '10010000', '10010001', '10010010', '10010011', '10010100', '10010101','10010110','10010111',
        '10011000', '10011001', '10011010', '10011011', '10011100', '10011101','10011110','10011111',
        '10100000', '10100001', '10100010', '10100011', '10100100', '10100101','10100110','10100111',
        '10101000', '10101001', '10101010', '10101011', '10101100', '10101101','10101110','10101111',
        '10110000', '10110001', '10110010', '10110011', '10110100', '10110101','10110110','10110111',
        '10111000', '10111001', '10111010', '10111011', '10111100', '10111101','10111110','10111111',
        '11000000', '11000001', '11000010', '11000011', '11000100', '11000101','11000110','11000111',
        '11001000', '11001001', '11001010', '11001011', '11001100', '11001101','11001110','11001111',
        '11010000', '11010001', '11010010', '11010011', '11010100', '11010101','11010110','11010111',
        '11011000', '11011001', '11011010', '11011011', '11011100', '11011101','11011110','11011111',
        '11100000', '11100001', '11100010', '11100011', '11100100', '11100101','11100110','11100111',
        '11101000', '11101001', '11101010', '11101011', '11101100', '11101101','11101110','11101111',
        '11110000', '11110001', '11110010', '11110011', '11110100', '11110101','11110110','11110111',
        '11111000', '11111001', '11111010', '11111011', '11111100', '11111101','11111110','11111111'
       );
    var
      iLen: Integer;
      I: Integer;
    begin
      Result := '';
      iLen := Length(Value);
      if iLen = 0 then Exit;
      SetLength(Result, iLen * 8);
      for I := 0 to iLen - 1 do
        begin
          Move(   PAnsiChar(Const_8BIT_BINARY_TEXT[Ord(Value[I + 1])])^
                , PAnsiChar(LongWord(PAnsiChar(Result)) + I * 8 )^
                , 8
                );
        end;
    end;
      

  2.   


      GetMem(Result,length(chs) + 1); 
      GetMem(rtnpchar,length(chs) + 1); 
      Result := '00000000';这几行代码挺有创意的……执行到第三句的时候,不但第一句分配的内存白分配了造成了内存泄露,而且Result还指向了处于常量段的内存。常量段的内存是只读的,写的话自然就报错了
    另外这代码效率也够低的了
      

  3.   

    function CharToBinString(chs: PAnsiChar): PAnsiChar;
    var
      ii: Integer;
      i:integer;
      ch: AnsiChar;
      iLen: Integer;
    begin
      Result := Nil;
      iLen := StrLen(Chs);
      if iLen = 0 then Exit;  GetMem(Result, iLen * 8 + 1);
      Result[iLen * 8] := #0;
      FillChar( Result^, iLen * 8, ord('0'));  for i:= 0 To iLen -1 do
      begin
        ch := chs[i];
        for ii := 7 downto 0 do
          if (Ord(ch) AND (1 shl ii)) > 0 then
            Result[(i + 1) * 8 - ii] := '1';
      end;
    end;
      

  4.   

    比1楼的效率高:function BufferToBinary(const Buffer; Size: Integer): AnsiString;
    const CPHex : array[$0..$f]of PAnsiChar = (
        '0000', '0001', '0010', '0011',
        '0100', '0101', '0110', '0111',
        '1000', '1001', '1010', '1011',
        '1100', '1101', '1110', '1111'  );
    var
      i : Integer;
      b : Byte;
      pRet  : PInteger;
    begin
      SetLength(Result, Size shl 3);
      pRet  := PInteger(Result);
      for i:=0 to Size-1 do
      begin
        b := Byte( PAnsiChar(@Buffer)[i] );
        pRet^ := PInteger(CPHex[b shr 4])^;
        Inc(pRet);
        pRet^ := PInteger(CPHex[b and $f])^;
        Inc(pRet);
      end;
    end;