从智能卡读取时的外部错误

时间:2013-04-11 10:50:13

标签: out-of-memory smartcard apdu gemalto

我正在使用.Net框架开发一个与金雅拓智能卡交互的应用程序(添加和检索), 我已经连续完成了添加部分,但是当我尝试读取存储在卡中的数据时,我在主机应用程序中得到了outOfMemoryException,有人可以弄清楚为什么会发生这种情况吗?

这是主机应用程序中从卡中读取的代码:

for (int i = 0; i < 5; i++)
{
     try
     {
          string bookString = service.getBook(i);
     }catch (Exception x) { 
          MessageBox.Show("an error occur");
     }
}

并且在卡上加载的app中,我有这个方法:

public string getBook(int index) 
{
     return BookList[index].getBookID() + " , " + BookList[index].getBookDesc();
}

3 个答案:

答案 0 :(得分:1)

  

Gemalto .NET卡包含持久性内存和易失性   用于数据存储的内存。持久性记忆充当   卡的持久存储 - 即使在数据存储之后数据仍然存在   卡从智能卡读卡器中删除。易失性存储器复位   当卡断电而不能用于持久存储时。

如何存储数据,以及如何使用数据填充BookList?请澄清更多。

当然你有内存限制,所以你不能存储到一定的大小,在这个.net卡中你有16KB的易失性内存(RAM)和70KB的持久性内存(包含程序集,存储内存)。

我在一些Gemalto .net卡中测试过并且能够在持久存储内存中存储20KB的数据,在此限制之后我得到相同的异常OutOfMemoryException(因为其他50KB充满了文件,程序集)。

此卡不用于存储数据库,记录等,用于存储密钥和密码等关键信息。所以不要保存超过这个大小,你的代码会没问题,或者使用任何文本压缩算法(在客户端应用程序中)来减少卡中存储之前的大小,但最后不要尝试存储超过这个~XX KB。

<强>更新: 由于这个限制,你不能在持久存储中存储超过70K,也不能从卡到客户端检索超过16KB(因为这些数据将存储在本地变量即易失性存储器中,然后检索回客户端,你有也在这里约束。)

所以这是你的问题的根源,你检索的不仅仅是易失性内存:

public string getBook(int index)
{
  return bookList[index].getId() + " , " + bookList[index].getName();
}

在返回值之前,此数据将暂时变量,并且由于您无法存储超过16KB的数据,因此会出现OutOfMemoryException异常。

解决方案是直接从客户端使用此存储(您有参考,所以只需使用它):

public Book getTheBook(int index)
{
   return bookList[index];
}

从客户端您可以访问Book功能(确保您的Book是struct,因为仅支持Gemalto .net卡中的struct和primitive类型的编组):

Console.WriteLine(service.getTheBook(0).getName());

答案 1 :(得分:0)

您正在尝试一项不适用于智能卡的任务。注意,这些卡的RAM在少数几KB的范围内,可以在操作系统和I / O缓冲区之间进行划分。后者不可能超过2 kByte(参考卡片手册),即使这样你也需要使用this answer中提到的扩展长度APDU。因此,您的错误的可能原因是,数据长度超过了I / O缓冲区的RAM量。虽然扩大缓冲区或使用扩展的APDU将扩大限制,但仍然很容易用很长的描述命中它。

答案 2 :(得分:0)

只有在尝试检索长字符串(例如100个单词)时才会出现此异常。我已完成添加部分,只需发送一串BookDesc即可完成。

public Book[] BookList=new Book[5];
public static int noOfBooks=0;

public string addBook(string bookDesc) 
{
   Book newBook=new Book();
   newBook.setBookDesc(bookDesc); 
   newBook.setBookID(noOfBooks);        
   BookList[noOfBooks]=newBook;
   noOfBooks++;
}