powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / JavaScript=>Delphi
23 сообщений из 48, страница 2 из 2
JavaScript=>Delphi
    #39611386
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторstr:=inputString;

откуда вы это берёте ?

Ariochа Delphi какой версии ?

не ответили....

авторRawByteString

судя по этому - Дельфи юникодная, 2009+, в ней нельзя дуриком двоичные данные в строки пихать
...
Рейтинг: 0 / 0
JavaScript=>Delphi
    #39611390
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
genokздесь зашифрована дата 13.08.1982
как её можно получить?

разобраться как устроены ваши данные и написать для них парсер

для начала мы даже не знаем из каких атомов данные состоят - байты, дву-байты, 4-байты, переменной длинны блоки - непонятно

откуды вы берете свои hex-числа, какие преобразования над ними проводятся до, какие после

вполне возможно ,что чатьс аднный уже испорчена
...
Рейтинг: 0 / 0
JavaScript=>Delphi
    #39611393
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
genokтам данные приходят в бинарном виде, одной строкой

вот эта вот фраза - невозможная в принципе

так не бывает

в юникодной Дельфи в строке - текст, а не бинарные данные

так что придется вам начинать с самого начала, танцевать от печки, разбираться как именно и в каких именно форматах и кто передает вам в программу данные
...
Рейтинг: 0 / 0
JavaScript=>Delphi
    #39611395
genok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochоткуда вы это берёте ?


Delphi XE2

беру данные отсюда:
Код: 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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
inputString=pcsc.GetResponseFromCard(Hex2Bin('00b00003a7'))


function TPCSCConnector.GetResponseFromCard(const APdu: string): string;
var
  RetVar : cardinal;
  SBuf   : AnsiString;
  SLen   : cardinal;
  RBuf   : AnsiString;
  RLen   : cardinal;
  Ppci   : Pointer;
begin
SBuf := APdu;
RBuf := StringOfChar(#0,MAXAPDULENGTH);
if Length(SBuf) <= MAXAPDULENGTH then
  begin
  case FAttrProtocol of
    SCARD_PROTOCOL_T0 : Ppci := @SCARD_PCI_T0;
    SCARD_PROTOCOL_T1 : Ppci := @SCARD_PCI_T1;
    else                Ppci := nil;
    end;
  SLen := Length(APdu);
  RLen := Length(RBuf);
  RetVar := SCardTransmit(FCardHandle, Ppci, Pointer(SBuf), SLen, nil, Pointer(RBuf), @RLen);
  if RetVar = SCARD_S_SUCCESS then
    begin
    Result := Copy(RBuf,1,RLen);
    end else
    begin
    Result := '';
    if Assigned(FOnError) then FOnError(Self, esTransmit, RetVar);
    end;
  end;
end;

function SCardTransmit;                   external WinSCardDLL name 'SCardTransmit';
...
Рейтинг: 0 / 0
JavaScript=>Delphi
    #39611397
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ваша программа хз что делает - 21082769 - и хз как хз что получает в ответ, и как тут дальше гадать?..
...
Рейтинг: 0 / 0
JavaScript=>Delphi
    #39611398
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
genok
Код: pascal
1.
function SCardTransmit;     



а где определение функции ?
...
Рейтинг: 0 / 0
JavaScript=>Delphi
    #39611401
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
genokinputString=pcsc.GetResponseFromCard( Hex2Bin('00b00003a7') )


function TPCSCConnector.GetResponseFromCard(const APdu: string ): string;

нельзя так делать в Юникодной Дельфи.
вам в этом случае возможно повезло - две ошибки взаимнно уничтожились. Но это просто вопрос везения, случайности.

читайте какие-нибудь FAQ про переход Delphi на Юникод в 2009 и про работу в Deдphi с бинарными данными

или хотя бы последную фразу в 21235857

но лучше найдите статьи и прочитайте
...
Рейтинг: 0 / 0
JavaScript=>Delphi
    #39611404
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
genok
Код: pascal
1.
if Length(SBuf) <= MAXAPDULENGTH then



А если нет, то что тогда?

ответ, тогда значение параметра Result останется таким, какое было передано из вызывающей программы, и о том, что была ошибка вообще никто не узнает.

судя по всему, писалось на коленке и абы как, вероятно "код с форума"
...
Рейтинг: 0 / 0
JavaScript=>Delphi
    #39611406
genok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochgenok
Код: pascal
1.
function SCardTransmit;     



а где определение функции ?

вот все что есть:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
   function SCardTransmit(hCard: LongInt; pioSendPci: Pointer; pbSendBuffer: PByte;
                          dwSendLength: DWORD; pioRecvPci: Pointer; pbRecvBuffer: PByte;
                          pcbRecvLength: PDWord): LongInt; stdcall;

(* WindowsXP winscard.dll
   8/23/2001   0:00          93,184  winscard.dll
   Exports from WinSCard.dll
   63 exported name(s), 63 export addresse(s).  Ordinal base is 1.
    Ord. Hint Name
    ---- ---- ----
      60 003B SCardTransmit
    *)
...
Рейтинг: 0 / 0
JavaScript=>Delphi
    #39611408
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
genok
Код: pascal
1.
  Result := Copy(RBuf,1,RLen);



вот здесь вы скорее всег опортите данные, и дальше в них смотреть большого смысла не имеет
...
Рейтинг: 0 / 0
JavaScript=>Delphi
    #39611411
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
genok
Код: pascal
1.
pbSendBuffer: PByte;



то есть там байты

если делать по человечески, то все данные надо передавать через TBytes оно же TArray<Byte> и не пользоваться строками вообще. Хотя бы для того, чтобы самому себя не запутывать ,где у вас тексты ,а гед довичные буферы.

если делать халявно - то надо использовать AnsiChar/PAnsiChar/AnsiString или RawbyteString и тщательно следить, чтобы ниоткуда и нигде не вылезло Char=WideChar/PChar=PWideChar/String=UnicodeString/WideString

а вообще, в самом деле, вам надо почитать как устроены внутрений типы Delphi (длинные строки и динамические массивы), что изменилось в Delphi 2009, и как теперь "по канону" полагается работать с бинарными данными.

После этого либо вы делаете как теперь принято, либо делаете "как в древних Delphi", но тогда крайне тщательно следите чтобы нигде не использовать новых типов и форматов ,появившихся в 2009

выбори за вами


genok
Код: pascal
1.
Exports from WinSCard.dll



это часть самой Windows или какой-то библиотеки для карты, любопытно

я бы возможно посмотрел последнюю версибю JEDI Win API Library - хотя она сама по себе довольно громоздкая
...
Рейтинг: 0 / 0
JavaScript=>Delphi
    #39611413
genok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch
но лучше найдите статьи и прочитайте

лет 5 назад перешел с Delphi7 на DelphiXE2, читал все это и вроде даже что-то понял, потому как получилось перенести проекты на юникодную RAD
но к нынешнему моменту в голове снова вакуум, увы.
видать, придется снова читать

в любом случае, спасибо за попытку помочь
...
Рейтинг: 0 / 0
JavaScript=>Delphi
    #39611417
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochэто часть самой Windows или какой-то библиотеки для карты, любопытно

судя по гуглу, это часть стандартного интерфейса, которые есть и в Windows и во всех других операционках

https://msdn.microsoft.com/library/windows/desktop/aa379804.aspx
https://www.codeproject.com/Questions/354281/How-to-send-APDU-command-using-SCardTransmit

остаётся читать и разбираться в смысле происходящего
...
Рейтинг: 0 / 0
JavaScript=>Delphi
    #39611423
genok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот нашел кусок JS который получает текст или дату, в зависимости от типа ожидаемых данных

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
 OutlineCard.prototype.printTLV = function(filenum, tlv, sub) {
  var tt = tlv.getTag() >> 8;
  var ta = tlv.getTag() & 0xFF;
  var value = tlv.getValue();
  if (this.tag_ref.hasOwnProperty([filenum, ta])) {
    var namtp = this.tag_ref[[filenum, ta]];
    var namsect = sub + namtp[0] + "_" + namtp[1];
    if (namtp[2] == "utf8") {
      print(namsect + ": " + value.toString(UTF8));
    } else if (namtp[2] == "date") {
      var s = "" + value.toString(HEX);
      print(namsect + ": " + s.substr(0, 2) + "." + 
        s.substr(2, 2) + "." + s.substr(4));
    }
...
Рейтинг: 0 / 0
JavaScript=>Delphi
    #39611436
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
genok
Код: javascript
1.
 tlv



какая знакомая аббревиатура, а?
...
Рейтинг: 0 / 0
JavaScript=>Delphi
    #39611440
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
genokвот нашел кусок JS

чтобы понять этот кусок вам надо понять, в каком виде данные до него дошли

то есть разобраться не только с двоичным форматом (который наверняка описан и в международном стандарте смарт-карт, и в Windows API и много где ещё), но и со всеми трансформациями данных, происходящими с этим буфером на пути к этому коду

начните с того, чтобы получать/хранить/передавать данные в исходном бинарном "сыром" (raw) виде в юникодной Delphi XE2, не разрушая их

Какой толк пялиться в чей-то код, если вам не к чему этот код применить?
...
Рейтинг: 0 / 0
JavaScript=>Delphi
    #39611445
genok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
допёр
оказалось, IntToHEX(Ord(ansiString[loop]),2) и IntToHEX(Ord(WideString[loop]),2) дают совершенно разный результат
не пинайте сильно, "рядовой шутник глуп и невежественен"

ну и вид блока с датой выходит таким:
автор5F 24 04 13 08 19 82 7F 30 33

в общем, дату увидел, уже хорошо
строковые данные тоже получил

теперь с потерями надо разобраться, конец строки явно режется
...
Рейтинг: 0 / 0
JavaScript=>Delphi
    #39611446
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
genokоказалось, IntToHEX(Ord(ansiString[loop]),2) и IntToHEX(Ord(WideString[loop]),2) дают совершенно разный результат

ага, нонче за тилипата я - 21240818

как же это тилипает!
...
Рейтинг: 0 / 0
JavaScript=>Delphi
    #39611447
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор13 08 19 82 7F 30 33

это 7 байтов, на 4 не делится
...
Рейтинг: 0 / 0
JavaScript=>Delphi
    #39611462
genok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochавтор13 08 19 82 7F 30 33

это 7 байтов, на 4 не делится

длина 4 байта к использованию указана, остальное лишнее судя по всему
почему так - не знаю и вряд ли получится разобраться у меня
...
Рейтинг: 0 / 0
JavaScript=>Delphi
    #39611464
genok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochgenokоказалось, IntToHEX(Ord(ansiString[loop]),2) и IntToHEX(Ord(WideString[loop]),2) дают совершенно разный результат

ага, нонче за тилипата я - 21240818

как же это тилипает!

так и есть, извините)
...
Рейтинг: 0 / 0
JavaScript=>Delphi
    #39611509
gssbox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вроде Вам ссылки выше давали там все есть, нужно только разобраться.

В конечном итоге у Вас должно получится что то вроде этого:
Код: 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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
unit uWinsCard;

interface

implementation

uses Winapi.Windows;

const
  WinSCardDll = 'WinSCard.dll';

{$MINENUMSIZE 4}

const
 SCARD_SCOPE_SYSTEM   = $0002;
 SCARD_SHARE_SHARED   = $0002;

SCARD_PROTOCOL_T0     = $0001;
SCARD_PROTOCOL_T1     = $0002;
SCARD_PROTOCOL_RAW    = $0004;

type
 SCARDCONTEXT = Integer;
 LPSCARDCONTEXT = ^SCARDCONTEXT;

 SCARDHANDLE  = Integer;
 LPSCARDHANDLE = ^SCARDHANDLE;

 LPCBYTE = Pointer;

type
 TSCARD_IO_REQUEST = packed record
   dwProtocol: DWORD;    // SCARD_PROTOCOL_T0, SCARD_PROTOCOL_T1 or SCARD_PROTOCOL_RAW
   cbPciLength: DWORD;   // Length of this structure
end;

function SCardEstablishContext(dwScope: DWORD;
                               pvReserved1: LPCVOID;
                               pvReserved2: LPCVOID;
                               phContext: LPSCARDCONTEXT): Integer; stdcall; external WinSCardDll;

function SCardConnect(hContext: SCARDCONTEXT;
                      szReader: LPCSTR;
                      dwShareMode: DWORD;
                      dwPreferredProtocols: DWORD;
                      phCard: LPSCARDHANDLE;
                      pdwActiveProtocol: LPDWORD): Integer; stdcall; external WinSCardDll;

function SCardTransmit(hCard: SCARDHANDLE;
                       pioSendPci: Pointer;
                       pbSendBuffer: LPCBYTE;
                       cbSendLength: DWORD;
                       pioRecvPci: Pointer; //LPBYTE
                       pbRecvBuffer: LPBYTE;
                       pcbRecvLength: LPDWORD): Integer; stdcall; external WinSCardDll;

procedure GetResponseAPDU;
 var
  rv: Integer;
  hContext: SCARDCONTEXT;
  hCard: SCARDHANDLE;
  dwActiveProtocol, dwSendLength, dwRecvLength: DWORD;
  pbRecvBuffer: array[0..9] of byte;
 const
  pbSendBuffer: array of byte = ( $C0, $A4, $00, $00, $02, $3F, $00 );
begin
    rv := SCardEstablishContext(SCARD_SCOPE_SYSTEM, nil, nil, @hContext);
    rv := SCardConnect(hContext, 'Reader X', SCARD_SHARE_SHARED,
             SCARD_PROTOCOL_T0, @hCard, @dwActiveProtocol);
    dwSendLength := SizeOf(pbSendBuffer);
    dwRecvLength := SizeOf(pbRecvBuffer);
    rv := SCardTransmit(hCard, SCARD_PCI_T0, pbSendBuffer, dwSendLength,
             nil, pbRecvBuffer, @dwRecvLength);
end;


end.

...
Рейтинг: 0 / 0
JavaScript=>Delphi
    #39611777
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
genok,

У вас же там пара строк кода. Ладно хотя бы тысяча была или тысяч десять. Сделайте нормально, то есть всё в массивах байт. Часть вопросов отпадёт сразу же.
...
Рейтинг: 0 / 0
23 сообщений из 48, страница 2 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / JavaScript=>Delphi
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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