Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 4-байтовое BCD представление, в формате little-endian  [new]
Alimkulov
Member

Откуда:
Сообщений: 745
Привет всем! Мне пришлось написать программу, которая должна общаться с неким API на C++.
В документации написано так:
/*
When developing user interfaces that support entering or modifying the user PIN, your application should prompt the user to enter between 1 and 8 ASCII characters in the range of 0
through 9.

When translating the PIN value entered by the user into data for an API call, you should convert
the input string into 4-byte BCD representation, in little-endian format (for example,
0x12345678 in binary is passed to the library as 0x78654312) before passing the PIN to a
library function.
*/
unsigned long __stdcall ChangeCode(char * OldCode,  unsigned long   OldCodeLen, unsigned char * NewCode, unsigned long NewCodeLen);


А вот это функция на Delphi
function ChangeCode(OldCode: PByte; OldCodeLen: NativeUInt; NewCode: PByte; NewCodeLen: NativeUInt): NativeUInt; stdcall;external ApiLib;


Здесь кроме этого очень много функций, все четко работает, но вот с этим ни как ни могу!

Пользователь имеет текущий PIN : 12345678 и новый PIN : 12345. Как передать этих данных на эту функцию, что бы поменялся PIN?

Заранее спасибо!
1 ноя 18, 14:07    [21721519]     Ответить | Цитировать Сообщить модератору
 Re: 4-байтовое BCD представление, в формате little-endian  [new]
Aleksandr Sharahov
Member

Откуда: Москва
Сообщений: 1670
Alimkulov,

ошибка в документации:

вместо 0x12345678 in binary is passed to the library as 0x78654312
надо 0x12345678 in binary is passed to the library as 0x78563412
1 ноя 18, 14:31    [21721564]     Ответить | Цитировать Сообщить модератору
 Re: 4-байтовое BCD представление, в формате little-endian  [new]
Aleksandr Sharahov
Member

Откуда: Москва
Сообщений: 1670
function SwapInteger(i: integer): integer; 
begin;
  i:=i shr 24 or i shl 24 or i and $FF00 shl 8 or i and $FF0000 shr 8;
  Result:=i;
  end;
1 ноя 18, 14:37    [21721581]     Ответить | Цитировать Сообщить модератору
 Re: 4-байтовое BCD представление, в формате little-endian  [new]
Alimkulov
Member

Откуда:
Сообщений: 745
Aleksandr Sharahov,
Спасибо что ответили!

Понял, и как теперь передать PByte(PInteger(var integer)) что ли?

К сообщению приложен файл. Размер - 19Kb
1 ноя 18, 14:38    [21721584]     Ответить | Цитировать Сообщить модератору
 Re: 4-байтовое BCD представление, в формате little-endian  [new]
Aleksandr Sharahov
Member

Откуда: Москва
Сообщений: 1670
Alimkulov,

ChangeCode(@OldCode, OldCodeLen, @NewCode, NewCodeLen)
1 ноя 18, 14:46    [21721593]     Ответить | Цитировать Сообщить модератору
 Re: 4-байтовое BCD представление, в формате little-endian  [new]
Alimkulov
Member

Откуда:
Сообщений: 745
procedure ChangeUserPIN(const AOldPIN, ANewPIN: string);

  function Endian(L: Integer): Integer;
  begin
    Result := Swap(L shr 16) or (Integer(Swap(L and $ffff)) shl 16);
  end;

  function SwapInteger(i: integer): integer;
  begin    
    i := i shr 24 or i shl 24 or i and $FF00 shl 8 or i and $FF0000 shr 8;
    Result := i;
  end;

var
  a, b: Integer;
  s, t: array[0..3] of Byte;
begin

  a := StrToInt(AOldPIN);
  b := StrToInt(ANewPIN);

  PInteger(@s)^ := SwapInteger(a);
  PInteger(@t)^ := SwapInteger(b);

  CheckStatus(ChangeCode(@s, 4, @t, 4));
end;


К сообщению приложен файл. Размер - 5Kb
1 ноя 18, 14:47    [21721595]     Ответить | Цитировать Сообщить модератору
 Re: 4-байтовое BCD представление, в формате little-endian  [new]
Aleksandr Sharahov
Member

Откуда: Москва
Сообщений: 1670
var
  a, b: Integer;
begin
  a := SwapInteger(StrToInt(AOldPIN));
  b := SwapInteger(StrToInt(ANewPIN));
  CheckStatus(ChangeCode(@a, 4, @b, 4));
1 ноя 18, 14:53    [21721599]     Ответить | Цитировать Сообщить модератору
 Re: 4-байтовое BCD представление, в формате little-endian  [new]
Alimkulov
Member

Откуда:
Сообщений: 745
Aleksandr Sharahov,

procedure ChangeUserPIN(const AOldPIN, ANewPIN: string);

  function SwapInteger(i: integer): integer;
  begin    
    i := i shr 24 or i shl 24 or i and $FF00 shl 8 or i and $FF0000 shr 8;
    Result := i;
  end;

var
  iOldPin, iNewPin: Integer;
begin

  iOldPin := SwapInteger(StrToInt(AOldPIN));
  iNewPin := SwapInteger(StrToInt(ANewPIN)); 

  CheckStatus(ChangeCode(@iOldPin, 4, @iNewPin, 4));
end;


Все равно такая же ошибка!

Входные параметры:
AOldPIN = '12345678'
ANewPIN = '1234567'

Результат вычисление SwapInteger:
iOldPin = 1315027968
iNewPin = -2016013824 (может не должно быть отрицательным)
1 ноя 18, 15:05    [21721613]     Ответить | Цитировать Сообщить модератору
 Re: 4-байтовое BCD представление, в формате little-endian  [new]
Aleksandr Sharahov
Member

Откуда: Москва
Сообщений: 1670
Alimkulov
Aleksandr Sharahov,

procedure ChangeUserPIN(const AOldPIN, ANewPIN: string);

  function SwapInteger(i: integer): integer;
  begin    
    i := i shr 24 or i shl 24 or i and $FF00 shl 8 or i and $FF0000 shr 8;
    Result := i;
  end;

var
  iOldPin, iNewPin: Integer;
begin

  iOldPin := SwapInteger(StrToInt(AOldPIN));
  iNewPin := SwapInteger(StrToInt(ANewPIN)); 

  CheckStatus(ChangeCode(@iOldPin, 4, @iNewPin, 4));
end;


Все равно такая же ошибка!

Входные параметры:
AOldPIN = '12345678'
ANewPIN = '1234567'

Результат вычисление SwapInteger:
iOldPin = 1315027968
iNewPin = -2016013824 (может не должно быть отрицательным)



you should convert the input string into 4-byte BCD representation, in little-endian format

не надо свопить, т.к у тебя уже LE:

  
  iOldPin := StrToInt(AOldPIN);
  iNewPin := StrToInt(ANewPIN); 

  CheckStatus(ChangeCode(@iOldPin, 4, @iNewPin, 4));
1 ноя 18, 15:16    [21721632]     Ответить | Цитировать Сообщить модератору
 Re: 4-байтовое BCD представление, в формате little-endian  [new]
Alimkulov
Member

Откуда:
Сообщений: 745
Aleksandr Sharahov,

procedure ChangeUserPIN(const AOldPIN, ANewPIN: string);
var
  iOldPin, iNewPin: Integer;
begin
  iOldPin := StrToInt(AOldPIN);
  iNewPin := StrToInt(ANewPIN); 

  CheckStatus(ChangeCode(@iOldPin, 4, @iNewPin, 4));
end;


Вроде с параметрами решили, но видимо iOldPin не дошло до API.

К сообщению приложен файл. Размер - 5Kb
1 ноя 18, 15:26    [21721651]     Ответить | Цитировать Сообщить модератору
 Re: 4-байтовое BCD представление, в формате little-endian  [new]
Aleksandr Sharahov
Member

Откуда: Москва
Сообщений: 1670
Alimkulov,

Сорри только ща заметил 4-byte BCD representation

Т.е. IntToStr не годится, надо посимвольно переводить
одна введенная цифра - один ниббл
1 ноя 18, 15:30    [21721654]     Ответить | Цитировать Сообщить модератору
 Re: 4-байтовое BCD представление, в формате little-endian  [new]
Aleksandr Sharahov
Member

Откуда: Москва
Сообщений: 1670
Aleksandr Sharahov
Alimkulov,

Сорри только ща заметил 4-byte BCD representation

Т.е. IntToStr не годится, надо посимвольно переводить
одна введенная цифра - один ниббл


Что-то вроде

code:=0;
for i:=1 to Length(s) do code:=code shl 4 or (ord(s[i]) - ord('0'));
1 ноя 18, 15:35    [21721663]     Ответить | Цитировать Сообщить модератору
 Re: 4-байтовое BCD представление, в формате little-endian  [new]
Alimkulov
Member

Откуда:
Сообщений: 745
Aleksandr Sharahov,

Оооо, Вы гений!

procedure ChangeUserPIN(const AOldPIN, ANewPIN: string);

  function StrToEndian(s: string): Integer;
  var
    i: Integer;
  begin
    Result := 0;
    for i := 1 to Length(s) do
      Result := Result shl 4 or (ord(s[i]) - ord('0'));
  end;

var
  iOldPin, iNewPin: Integer;
begin

  iOldPin := StrToEndian(AOldPIN);
  iNewPin := StrToEndian(ANewPIN); 

  CheckStatus(ChangeCode(@iOldPin, 4, @iNewPin, 4));
end;


Спасибо большое!
1 ноя 18, 15:53    [21721692]     Ответить | Цитировать Сообщить модератору
 Re: 4-байтовое BCD представление, в формате little-endian  [new]
Aleksandr Sharahov
Member

Откуда: Москва
Сообщений: 1670
Alimkulov,

измените
function StrToEndian(const s: string): Integer;
2 ноя 18, 09:40    [21722164]     Ответить | Цитировать Сообщить модератору
 Re: 4-байтовое BCD представление, в формате little-endian  [new]
Alimkulov
Member

Откуда:
Сообщений: 745
Aleksandr Sharahov,

Да да конечно, так и сделал, спасибо!
2 ноя 18, 15:50    [21722633]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить