Как написать UTF-8 в Mifare Card

Jin_Jin спросил: 26 ноября 2017 в 05:00 в: c#

Я пытаюсь создать программу управления членством в членах, используя MifareCard & NFC Reader.

В этом коде английский, как правило, нормальный, но другие языки не работают.

Как и в случае записи данных на карту"北京", прочитайте записанные данные"yyyy" Запись данных на карту "서울", чтение записанных данных "yyyy" Запись данных на карту "さ く ら", чтение записанных данных "yyyyyy"

Как использовать кодировку UTF8 для записи данных в MifareCard?

Main.CS

#region Write_Data
private void Button_Click_2(object sender, RoutedEventArgs e)
{
    if (connectCard())// establish connection to the card: you've declared this from previous post
    {
        byte[] bytes = Encoding.Default.GetBytes(textBox2.Text);
        String insert_Value = Encoding.UTF8.GetString(bytes);
        submitText(insert_Value, Combo_W.Text); // 5 - is the block we are writing data on the card
        Close();
    }
}//submit data method
public void submitText(String Text, String Block)
{    String tmpStr = Text;
    int indx;
    if (authenticateBlock(Block))
    {
        ClearBuffers();
        SendBuff[0] = 0xFF;                             // CLA
        SendBuff[1] = 0xD6;                             // INS
        SendBuff[2] = 0x00;                             // P1
        SendBuff[3] = (byte)int.Parse(Block);           // P2 : Starting Block No.
        SendBuff[4] = (byte)int.Parse("16");            // P3 : Data length        for (indx = 0; indx <= (tmpStr).Length - 1; indx++)
        {
            SendBuff[indx + 5] = (byte)tmpStr[indx];
        }
        SendLen = SendBuff[4] + 5;
        RecvLen = 0x02;        retCode = SendAPDUandDisplay(2);        if (retCode != Card.SCARD_S_SUCCESS)
        {
            MessageBox.Show("fail write");        }
        else
        {
            MessageBox.Show("write success");
        }
    }
    else
    {
        MessageBox.Show("FailAuthentication");
    }
}// block authentication
private bool authenticateBlock(String block)
{
    ClearBuffers();
    SendBuff[0] = 0xFF;                         // CLA
    SendBuff[2] = 0x00;                         // P1: same for all source types 
    SendBuff[1] = 0x86;                         // INS: for stored key input
    SendBuff[3] = 0x00;                         // P2 : Memory location;  P2: for stored key input
    SendBuff[4] = 0x05;                         // P3: for stored key input
    SendBuff[5] = 0x01;                         // Byte 1: version number
    SendBuff[6] = 0x00;                         // Byte 2
    SendBuff[7] = (byte)int.Parse(block);       // Byte 3: sectore no. for stored key input
    SendBuff[8] = 0x60;                         // Byte 4 : Key A for stored key input
    SendBuff[9] = (byte)int.Parse("1");         // Byte 5 : Session key for non-volatile memory    SendLen = 0x0A;
    RecvLen = 0x02;    retCode = SendAPDUandDisplay(0);    if (retCode != Card.SCARD_S_SUCCESS)
    {
        //MessageBox.Show("FAIL Authentication!");
        return false;
    }    return true;
}// clear memory buffers
private void ClearBuffers()
{
    long indx;    for (indx = 0; indx <= 262; indx++)
    {
        RecvBuff[indx] = 0;
        SendBuff[indx] = 0;
    }
}// send application protocol data unit : communication unit between a smart card reader and a smart card
private int SendAPDUandDisplay(int reqType)
{
    int indx;
    string tmpStr = "";    pioSendRequest.dwProtocol = Aprotocol;
    pioSendRequest.cbPciLength = 8;    //Display Apdu In
    for (indx = 0; indx <= SendLen - 1; indx++)
    {
        tmpStr = tmpStr + " " + string.Format("{0:X2}", SendBuff[indx]);
    }    retCode = Card.SCardTransmit(hCard, ref pioSendRequest, ref SendBuff[0],
                         SendLen, ref pioSendRequest, ref RecvBuff[0], ref RecvLen);    if (retCode != Card.SCARD_S_SUCCESS)
    {
        return retCode;
    }    else
    {
        try
        {
            tmpStr = "";
            switch (reqType)
            {
                case 0:
                    for (indx = (RecvLen - 2); indx <= (RecvLen - 1); indx++)
                    {
                        tmpStr = tmpStr + " " + string.Format("{0:X2}", RecvBuff[indx]);
                    }                    if ((tmpStr).Trim() != "90 00")
                    {
                        //MessageBox.Show("Return bytes are not acceptable.");
                        return -202;
                    }                    break;                case 1:                    for (indx = (RecvLen - 2); indx <= (RecvLen - 1); indx++)
                    {
                        tmpStr = tmpStr + string.Format("{0:X2}", RecvBuff[indx]);
                    }                    if (tmpStr.Trim() != "90 00")
                    {
                        tmpStr = tmpStr + " " + string.Format("{0:X2}", RecvBuff[indx]);
                    }                    else
                    {
                        tmpStr = "ATR : ";
                        for (indx = 0; indx <= (RecvLen - 3); indx++)
                        {
                            tmpStr = tmpStr + " " + string.Format("{0:X2}", RecvBuff[indx]);
                        }
                    }                    break;                case 2:                    for (indx = 0; indx <= (RecvLen - 1); indx++)
                    {
                        tmpStr = tmpStr + " " + string.Format("{0:X2}", RecvBuff[indx]);
                    }                    break;
            }
        }
        catch (IndexOutOfRangeException)
        {
            return -200;
        }
    }
    return retCode;
}//disconnect card reader connection
public void Close()
{
    if (connActive)
    {
        retCode = Card.SCardDisconnect(hCard, Card.SCARD_UNPOWER_CARD);
    }
    //retCode = Card.SCardReleaseContext(hCard);
}
#endregion#region Read_Data
private void Button_Click_1(object sender, RoutedEventArgs e)
{
    string text = verifyCard(Combo_R.Text); // 5 - is the block we are reading
    byte[] bytes = Encoding.Default.GetBytes(text);
    textBox1.Text = Encoding.UTF8.GetString(bytes);
}public string verifyCard(String Block)
{
    string value = "";
    if (connectCard())
    {
        value = readBlock(Block);
    }    value = value.Split(new char[] { '\0' }, 2, StringSplitOptions.None)[0].ToString();
    return value;
}public string readBlock(String Block)
{
    string tmpStr = "";
    int indx;    if (authenticateBlock(Block))
    {
        ClearBuffers();
        SendBuff[0] = 0xFF; // CLA 
        SendBuff[1] = 0xB0;// INS
        SendBuff[2] = 0x00;// P1
        SendBuff[3] = (byte)int.Parse(Block);// P2 : Block No.
        SendBuff[4] = (byte)int.Parse("16");// Le        SendLen = 5;
        RecvLen = SendBuff[4] + 2;        retCode = SendAPDUandDisplay(2);        if (retCode == -200)
        {
            return "outofrangeexception";
        }        if (retCode == -202)
        {
            return "BytesNotAcceptable";
        }        if (retCode != Card.SCARD_S_SUCCESS)
        {
            return "FailRead";
        }        // Display data in text format
        for (indx = 0; indx <= RecvLen - 1; indx++)
        {
            tmpStr = tmpStr + Convert.ToChar(RecvBuff[indx]);
        }        return (tmpStr);
    }
    else
    {
        return "FailAuthentication";
    }
}
#endregion

0 ответов