ANKIT JOHRI Ответов: 2

Как хранить любые данные размером 20 байт в 2 блоках MIFARE classic 1k с помощью C#


Всем привет,
Пожалуйста, дайте мне знать, что я использую карту MIFARE classic 1k, у меня есть поле "имя", которое составляет 20 байт, так как 1 блок в mifare=16 байт o для остальных 4 байта, как я могу восстановить во втором блоке.

Что я уже пробовал:

теперь я попробовал только с 16 байтами.

string tmpStr;
            int indx;

            string BlockNumber_Name = "36";
            string BlockNumber_Id = "37";
            string BlockNumber_Date = "38";
            string DataLength = "16";



            int tempInt;
            if (BlockNumber_Name == "" | !int.TryParse(BlockNumber_Name, out tempInt))
            {

                //  tBinBlk.Focus();
                BlockNumber_Name = "";
                return;
            }
            if (int.Parse(BlockNumber_Name) > 319)
            {

                BlockNumber_Name = "319";
                return;

            }

            if (DataLength == "" | !int.TryParse(DataLength, out tempInt))
            {

                // tBinLen.Focus();
                DataLength = "";
                return;

            }


            if (Name_txt.Text == "")
            {

                Name_txt.Focus();
                return;

            }


            tmpStr = Name_txt.Text;

            ClearBuffers();
            SendBuff[0] = 0xFF;                                     // CLA
            SendBuff[1] = 0xD6;                                     // INS
            SendBuff[2] = 0x00;                                     // P1
            SendBuff[3] = (byte)int.Parse(BlockNumber_Name);            // P2 : Starting Block No.
            SendBuff[4] = (byte)int.Parse(DataLength);            // P3 : Data length

            for (indx = 0; indx <= (tmpStr).Length - 1; indx++)
            {

                SendBuff[indx + 5] = (byte)tmpStr[indx];

            }
            SendLen = SendBuff[4] + 5;
            RecvLen = 0x02;

2 Ответов

Рейтинг:
2

Jochen Arndt

Поскольку страница имеет размер 16 байт, вы должны отправить две команды записи:
Один, как уже сделано, и еще один с номером блока + 1, Данные, начинающиеся со смещения 16 вашего tempStr, а длина 4.

Но это вступило бы в противоречие с Id номер блока из вашего примера. Таким образом, вы должны проверить документацию для вашей карты, если этот номер блока правильный или если Id возможно, он хранится в этом блоке со смещением 4.

Кстати: почему вы используете строки для параметров, которые являются всего лишь байтами?
Если они из полей ввода, я бы сначала проверил и преобразовал их. Затем вы можете реализовать функцию записи, принимающую числовые параметры вместо строк.


Рейтинг:
1

ANKIT JOHRI

я должен написать это


string blkAuth = "36";
            string blk1 = "36";
            string blk2 = "37";
            string blk3 = "38";

            string val1 = Passid_txt.Text; //username
            string fullname = Name_txt.Text;
            string val2 = fullname.Substring(0, 14);  //validity 
            string val3 = fullname.Substring(14,6);

            write_authenticaion(blkAuth,blk1,blk2,blk3,val1,val2,val3);
            

             string blkAuth11 = "40";
            string blk11 = "40";
            string blk21 = "41";
            string blk31 = "42";

            string val11 = validdate_txt.Text;//username
            string val21 = prmsble_txt.Text;//validity
            string val31 = upjrnydate_txt.Text;

            write_authenticaion(blkAuth11,blk11,blk21,blk31,val11,val21,val31);



where_authentication-это класс, в котором я объявляю аутентификацию APDUs