Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > аналог функции pack из php


Автор: gashik 31.5.2012, 07:03
Здравствуйте уважаемые профи!!!

Собственно, вопрос:
есть следующее выражение на пхп, относящееся к ws-security

Код

$mydigest = base64_encode(pack("H*", sha1(base64_decode($digest[nonce]) . $digest[created] . 'user')));



сделал на делфи

Код

  s:=EncodeBase64(SHA1(s+Hdr.UsernameToken.Created.NativeToXS+pass));



но без упаковки, который делает pack выдает ессно неправильный результат. Помогите упаковать данные как на пыхе, с форматом H. В гугле ниче не нашел, что могло бы мне помочь.
Так, на всякий случай для справки:автор
Цитата

string pack (string format [, mixed args])
Упаковывает данные аргументы в бинарную строку в соответствии с форматом format. Возвращает бинарную строку с данными.


H Hex-строка, сначала высший разряд

Код

$binarydata = pack ("р*", '1234');



 Результирующая бинарная строка имеет длину 6 байт и содержит байтовую последовательность 0x12, 0x34.

Автор: Alkash 31.5.2012, 10:04
Код

s := Format('%x', [StrToInt(raw)]);
HexToBin(PChar(s), @s, length(s));


Что-то вроде этого воспроизводит указанный функционал.

Автор: gashik 31.5.2012, 10:10
Цитата(Alkash @  31.5.2012,  10:04 Найти цитируемый пост)
s := Format('%x', [StrToInt(raw)]);HexToBin(PChar(s), @s, length(s));

Не, не получаеться. Слишком большая длина строки. SHA1 - 40 символов. Вываливаеться эксепшн "is not a valid integer value". 

Автор: CynicRus 31.5.2012, 10:42
А исходную строку вы в [StrToInt(raw)] кладете?

Добавлено через 1 минуту и 47 секунд
Слишком большая длинна строки, это несколько...м-м - неверно, поскольку компилятор ругается на некорректное значение integer. 

Автор: gashik 31.5.2012, 15:19
var s: RawByteString; - не?

Автор: CynicRus 31.5.2012, 16:15
Попробуй s: string, должно работать. Ибо как гласит classes.pas 

Код

function HexToBin(Text : PWideChar; Buffer: PAnsiChar; BufSize: Integer): Integer;
function HexToBin(Text : PAnsiChar; Buffer: PAnsiChar; BufSize: Integer): Integer;
function HexToBin(Text: PWideChar; var Buffer; BufSize: Integer): Integer;
function HexToBin(Text: PAnsiChar; var Buffer; BufSize: Integer): Integer;
function HexToBin(Text: PWideChar; Buffer: Pointer; BufSize: Integer): Integer;
function HexToBin(Text: PAnsiChar; Buffer: Pointer; BufSize: Integer): Integer;

Автор: gashik 31.5.2012, 16:35
s: string - тот же ексепшн

не получаеться((


Код

$digest['nonce']='jg6YcXB2F0SJq4VVzXEsOQkAAAAAAA==';
$digest[created]='2012-05-30T18:16:16.500Z';
$pass=user;

$mydigest = sha1(base64_decode($digest[nonce]) . $digest[created] . $pass) //результат в  mydigest 97074e9f4d973a45be825e5a37cfbaeaf26c1768, длина строки 40 байт

$mydigest = pack("H*",$mydigest) //результат в  mydigest #97#07#4E#9F#4D#97#3A#45#BE#82#5E#5A#37#CF#BA#EA#F2#6C#17#68, длина строки 20 байт




Код

var
   pass,myDate,s:RawByteString;
   i: TBytes;
begin
  pass:='user';
  myDate:='2012-05-30T18:16:16.500Z';
  s:='jg6YcXB2F0SJq4VVzXEsOQkAAAAAAA==';
  s:=Base64decode(PAnsiChar(s),Length(s));
  s:=SHA1(s+myDate+pass); // результат верный, совпадает с результатом в пхп 97074e9f4d973a45be825e5a37cfbaeaf26c1768
  i:=BytesOf(s);

  SetLength(S, Length(i) * 2);
  BinToHex(PAnsiChar(i), PChar(S), Length(i));//  результат, ессно не совпадает и размер тоже
end;

Автор: gashik 31.5.2012, 16:53
Может я что-то не так обьяснил 

Код

$mydigest=pack("H*",'12345678');// в переменной $mydigest значение равное #12#34#56#78

Автор: gashik 31.5.2012, 21:47
НАШЕЛ!!!!!!
Код


function StrToHex(Const Source: String): String;
 var
   c:Char;
 begin
   Result := '';
   for c in Source do
     Result := Result + IntToHex(Integer(c), 2);
 end;


function HexToStr(HexStr : String; const Text : boolean = True) : string;
 var
   Hex : byte;
   sTemp : string;
   i : integer;
 begin
   Result := '';
   if Length(HexStr) mod 2 <> 0 then
     Exit;//('Неправельная длина строки');

   for i := 2 to Length(HexStr) do
     if i mod 2 = 0 then begin
       sTemp := '$' + Copy(HexStr, i - 1, 2);
       Hex := Byte(StrToInt(sTemp));

       if Hex = $00 then begin
         if Text then
           Result := Result + ' '
         else
           Result := Result + #$00;
         Continue;
       end;
       Result := Result + chr(Hex);
     end;
 end;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)