powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / 4-байтовое BCD представление, в формате little-endian
15 сообщений из 15, страница 1 из 1
4-байтовое BCD представление, в формате little-endian
    #39726571
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем! Мне пришлось написать программу, которая должна общаться с неким 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
4-байтовое BCD представление, в формате little-endian
    #39726596
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alimkulov,

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

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

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

ChangeCode(@OldCode, OldCodeLen, @NewCode, NewCodeLen)
...
Рейтинг: 0 / 0
4-байтовое BCD представление, в формате little-endian
    #39726618
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
4-байтовое BCD представление, в формате little-endian
    #39726621
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
4-байтовое BCD представление, в формате little-endian
    #39726628
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
4-байтовое BCD представление, в формате little-endian
    #39726639
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
4-байтовое BCD представление, в формате little-endian
    #39726653
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
4-байтовое BCD представление, в формате little-endian
    #39726655
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alimkulov,

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

Т.е. IntToStr не годится, надо посимвольно переводить
одна введенная цифра - один ниббл
...
Рейтинг: 0 / 0
4-байтовое BCD представление, в формате little-endian
    #39726663
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
4-байтовое BCD представление, в формате little-endian
    #39726683
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
4-байтовое BCD представление, в формате little-endian
    #39726983
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alimkulov,

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

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


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