Как я могу перевернуть строку в корзину? - PullRequest
1 голос
/ 02 июля 2011

Как я могу преобразовать бин в строку? Например:

 string:='s';----------->bin:='0011';

Как конвертировать обратно?

Мой код stringtobin:

function StrToBinStr( aString: string ): string;
var
i : integer;
begin
for i := 1 to Length( aString ) do
result := IntToBin( byte(aString[i]), 4 );
end;

function IntToBin(aValue, Bits: integer): string;
var
i : integer;
begin
for i := Bits-1 downto 0 do
result := result + Copy( '10', Word(((1 shl i) and AValue) = 0)+1, 1 );
end;

Ответы [ 2 ]

3 голосов
/ 02 июля 2011

Это может помочь:

function  IntToBin( const Value: LongInt; Digits: Byte;
  const Spaces: Boolean ): AnsiString;
begin
  if Digits > 32 then
    Digits := 32;
  SetLength( Result, Digits );
  Result := '';
  while Digits > 0 do
  begin
    if (Spaces) and ((Digits mod 8) = 0) then
      Result := Result + #32;
    Dec(Digits, 1);
    Result := Result + IntToStr((Value shr Digits) and 1);
  end;
end;

function BinToInt( Value: AnsiString ): LongInt;
var
  cTmp: AnsiChar;
  liCtr, liLen: LongInt;
begin
  Value := AnsiString(StringReplace(Value, #32, '', [rfReplaceAll]));
  liLen := Length(Value);
  cTmp := Value[liLen];
  Dec(liLen);
  Result := StrToInt(cTmp);
  liCtr := 1;
  while liLen > 0 do
  begin
    cTmp := Value[liLen];
    Dec( liLen );
    Result := Result + (StrToInt(cTmp) shl liCtr );
    Inc(liCtr);
  end;
end;

Пример использования:

procedure TForm1.FormShow(Sender: TObject);
var
  TestStr: AnsiString;
  i: Integer;
  Temp: AnsiString;
begin
  TestStr := 'ABC';
  Temp := '';
  for i := 1 to Length(TestStr) do
    Temp := Temp + IntToBin(Ord(AnsiChar(TestStr[i])), 8, False);
  ShowMessage('Temp = ' + Temp);

  TestStr := '';
  i := 1;
  while i < Length(Temp) do
  begin
    TestStr := TestStr + AnsiChar(BinToInt(Copy(Temp, i, 8)));
    Inc(i, 8);
  end;
  ShowMessage('TestStr = ' + TestStr);
end;

Как я уже сказал в своем комментарии к вашему первоначальному вопросу, я думаю, что это ужасная идея, но эти работы.

0 голосов
/ 16 апреля 2013
function _ConvertHexToWideString(AHex: AnsiString): WideString;
var wBinaryStream: TMemoryStream;
begin
  try
    wBinaryStream := TMemoryStream.Create;

    try
      wBinaryStream.Size := Length(AHex) div 2;

      if wBinaryStream.Size > 0 then
        HexToBin(PAnsiChar(AHex), wBinaryStream.Memory, wBinaryStream.Size);
    except
    end;

    SetString(Result, PWideChar(wBinaryStream.Memory), wBinaryStream.Size div SizeOf(WideChar));
  finally
    FreeAndNil(wBinaryStream);
  end;
end;
...