Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / 4-байтовое BCD представление, в формате little-endian / 15 сообщений из 15, страница 1 из 1
01.11.2018, 14:07
    #39726571
Alimkulov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
4-байтовое BCD представление, в формате little-endian
Привет всем! Мне пришлось написать программу, которая должна общаться с неким API на C++.
В документации написано так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
/*
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
Код: pascal
1.
function ChangeCode(OldCode: PByte; OldCodeLen: NativeUInt; NewCode: PByte; NewCodeLen: NativeUInt): NativeUInt; stdcall;external ApiLib;



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

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

Заранее спасибо!
...
Рейтинг: 0 / 0
01.11.2018, 14:31
    #39726596
Aleksandr Sharahov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
4-байтовое BCD представление, в формате little-endian
Alimkulov,

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

вместо 0x12345678 in binary is passed to the library as 0x78654312
надо 0x12345678 in binary is passed to the library as 0x78563412
...
Рейтинг: 0 / 0
01.11.2018, 14:37
    #39726608
Aleksandr Sharahov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
4-байтовое BCD представление, в формате little-endian
Код: pascal
1.
2.
3.
4.
5.
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;
...
Рейтинг: 0 / 0
01.11.2018, 14:38
    #39726610
Alimkulov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
4-байтовое BCD представление, в формате little-endian
Aleksandr Sharahov,
Спасибо что ответили!

Понял, и как теперь передать PByte(PInteger(var integer)) что ли?
...
Рейтинг: 0 / 0
01.11.2018, 14:46
    #39726616
Aleksandr Sharahov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
4-байтовое BCD представление, в формате little-endian
Alimkulov,

ChangeCode(@OldCode, OldCodeLen, @NewCode, NewCodeLen)
...
Рейтинг: 0 / 0
01.11.2018, 14:47
    #39726618
Alimkulov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
4-байтовое BCD представление, в формате little-endian
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
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;
...
Рейтинг: 0 / 0
01.11.2018, 14:53
    #39726621
Aleksandr Sharahov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
4-байтовое BCD представление, в формате little-endian
Код: pascal
1.
2.
3.
4.
5.
6.
var
  a, b: Integer;
begin
  a := SwapInteger(StrToInt(AOldPIN));
  b := SwapInteger(StrToInt(ANewPIN));
  CheckStatus(ChangeCode(@a, 4, @b, 4));
...
Рейтинг: 0 / 0
01.11.2018, 15:05
    #39726628
Alimkulov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
4-байтовое BCD представление, в формате little-endian
Aleksandr Sharahov,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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 (может не должно быть отрицательным)
...
Рейтинг: 0 / 0
01.11.2018, 15:16
    #39726639
Aleksandr Sharahov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
4-байтовое BCD представление, в формате little-endian
AlimkulovAleksandr Sharahov,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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:

Код: pascal
1.
2.
3.
4.
5.
  
  iOldPin := StrToInt(AOldPIN);
  iNewPin := StrToInt(ANewPIN); 

  CheckStatus(ChangeCode(@iOldPin, 4, @iNewPin, 4));
...
Рейтинг: 0 / 0
01.11.2018, 15:26
    #39726653
Alimkulov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
4-байтовое BCD представление, в формате little-endian
Aleksandr Sharahov,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
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.
...
Рейтинг: 0 / 0
01.11.2018, 15:30
    #39726655
Aleksandr Sharahov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
4-байтовое BCD представление, в формате little-endian
Alimkulov,

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

Т.е. IntToStr не годится, надо посимвольно переводить
одна введенная цифра - один ниббл
...
Рейтинг: 0 / 0
01.11.2018, 15:35
    #39726663
Aleksandr Sharahov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
4-байтовое BCD представление, в формате little-endian
Aleksandr SharahovAlimkulov,

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

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

Что-то вроде

Код: pascal
1.
2.
code:=0;
for i:=1 to Length(s) do code:=code shl 4 or (ord(s[i]) - ord('0'));
...
Рейтинг: 0 / 0
01.11.2018, 15:53
    #39726683
Alimkulov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
4-байтовое BCD представление, в формате little-endian
Aleksandr Sharahov,

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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
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;



Спасибо большое!
...
Рейтинг: 0 / 0
02.11.2018, 09:40
    #39726983
Aleksandr Sharahov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
4-байтовое BCD представление, в формате little-endian
Alimkulov,

измените
function StrToEndian( const s: string): Integer;
...
Рейтинг: 0 / 0
02.11.2018, 15:50
    #39727292
Alimkulov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
4-байтовое BCD представление, в формате little-endian
Aleksandr Sharahov,

Да да конечно, так и сделал, спасибо!
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / 4-байтовое BCD представление, в формате little-endian / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]