Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Перевод значения в бинарный код [D6, WinXP]


Валера ©   (2009-01-28 11:53:00) 

Приветствую всех!
Столкнулся с такой проблемой: Как перевести строку в бинарный код

К примеру; WFD76-AS7R3-UTR27-2H2DW

Изначально делал на оборот читал значение в бинарном коде и переводил его
function DecodeKey(const HexSrc: array of Byte): string;
const
StartOffset: Integer = $34;
EndOffset: Integer   = $34 + 15;
Digits: array[0..23] of CHAR = ('B', 'C', 'D', 'F', 'G', 'H', 'J',
  'K', 'M', 'P', 'Q', 'R', 'T', 'V', 'W', 'X', 'Y', '2', '3', '4', '6', '7', '8', '9');
dLen: Integer = 29;
sLen: Integer = 15;
var
HexDigitalPID: array of CARDINAL;
Des: array of CHAR;
I, N: INTEGER;
HN, Value: CARDINAL;
begin
SetLength(HexDigitalPID, dLen);
for I := StartOffset to EndOffset do
begin
  HexDigitalPID[I - StartOffSet] := HexSrc[I];
end;
SetLength(Des, dLen + 1);
for I := dLen - 1 downto 0 do
begin
  if (((I + 1) mod 6) = 0) then
  begin
    Des[I] := '-';
  end
  else
  begin
    HN := 0;
    for N := sLen - 1 downto 0 do
    begin
      Value := (HN shl 8) or HexDigitalPID[N];
      HexDigitalPID[N] := Value div 24;
      HN    := Value mod 24;
    end;
    Des[I] := Digits[HN];
  end;
end;
Des[dLen] := Chr(0);
for I := 0 to Length(Des) do
begin
  Result := Result + Des[I];
end;
end;


Eraser   (2009-01-28 18:46:00) [1]

PS если нужно перевести не строковые данные в строковые, то Base64 в помощь и не нужно изобретать велосипед )


Eraser   (2009-01-28 18:45:00) [2]

> [0] Валера   (28.01.09 11:53)

как все сложно.

в д2009 есть функции BytesOf и StringOf.

но можно и вручную ничего сложного там нет. например вот реализация перевода строки в буфер.

function BytesOf(const Val: RawByteString): TBytes;
var
 Len: Integer;
begin
 Len := Length(Val);
 SetLength(Result, Len);
 Move(Val[1], Result[0], Len);
end;

function BytesOf(const Val: AnsiChar): TBytes;
begin
 SetLength(Result, 1);
 Result[0] := Byte(Val);
end;


Ega23   (2009-01-28 16:54:00) [3]


> А от чего этот серийник?


А это совсем необязательно серийник.


charoey_mag   (2009-01-28 15:59:00) [4]

А от чего этот серийник?


Правильный$Вася   (2009-01-28 15:40:00) [5]


> а зачем побайтно-то писать?

мож, из строки минусы выкинуть надо как атрибут визуализации, не требующий хранения


Ega23   (2009-01-28 14:19:00) [6]


> а зачем побайтно-то писать?
> Stream.WriteBuffer(S, Length(S));


И то верно. Фигню сморозил.


clickmaker   (2009-01-28 14:11:00) [7]


> Ega23 ©   (28.01.09 13:40) [3]

а зачем побайтно-то писать?
Stream.WriteBuffer(S, Length(S));


Правильный$Вася   (2009-01-28 13:40:00) [8]


> Как перевести строку в бинарный кодК примеру; WFD76-AS7R3-
> UTR27-2H2DW

строка и так бинарно хранится в памяти
а символы - просто способ интерпретации этих байтов


Ega23   (2009-01-28 13:40:00) [9]


procedure StringToStream(Stream : TStream; const Str : string);
var
 i : Integer;
 b : byte;
begin
 for i:=1 to Length(Str) do
 begin
   b := Ord(Str[i]);
   Stream.WriteBuffer(b, 1);
 end;
end;


MBo   (2009-01-28 13:12:00) [10]

Можно еще на словах алгоритм объяснить?


Наверх

Титульная страница Поиск, карта сайта Написать письмо