1

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

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

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

在卡上加载的应用程序中,我有这个方法:

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

3 回答 3

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 是结构,因为编组仅支持 Gemalto .net 卡中的结构和原始类型):

Console.WriteLine(service.getTheBook(0).getName());
于 2013-04-14T08:14:10.417 回答
0

您正在尝试智能卡不典型的任务。请注意,卡的 RAM 在少数 kByte 范围内,可在操作系统和 I/O 缓冲区之间进行划分。后者不太可能超过 2 kByte(请参阅卡手册),即使如此,您也需要使用此答案中提到的扩展长度 APDU 。因此,您的错误的可能原因是数据长度超过了 I/O 缓冲区的 RAM 量。虽然扩大缓冲区或使用扩展的 APDU 会扩大限制,但仍然很容易通过非常长的描述来达到它。

于 2013-04-12T07:17:51.060 回答
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++;
}
于 2013-04-14T08:42:09.820 回答