READ BINARY
APDU permiten bytes para el desplazamiento de archivo, codificado en P1 y P2, y el uso de la longitud Le, por READ BINARY
el número de bytes en la respuesta. P1 es alto byte, o el byte más significativo. Sin embargo, el bit superior de P1 está reservado para indicar si P1 también contiene un identificador de archivo corto . Debe permanecer a su valor 0
si ya está leyendo un archivo, dejándole con un desplazamiento del máximo 32Ki - 1.
no puedo leer las especificaciones que ha asociado pero vamos a suponer que el READ BINARY
APDU en su la tarjeta funciona de la misma manera.
Su comando para leer los primeros 256 bytes parece correcta, señalando que Le==0x00
indica una lectura de 256 bytes.
para leer los bytes comenzando en el desplazamiento 256, 512, etc., incrementando comenzar P1, por ejemplo:
00 B0 01 00 00
00 B0 02 00 00
00 B0 03 00 00
Para leer 256 bytes comenzando en el offset 257 (0x101):
00 B0 01 01 00
Offset 600 (0x258):
00 B0 02 58 00
En su código, si usted está usando Java int
para almacenar el desplazamiento, por lo general va a terminar incrementando P1 con algo como esto:
int offset;
int P1, P2;
while (continueReading)
{
// ...
P1 = (offset >> 8) & 0xFF;
P2 = offset & 0x00FF;
// ...
// send APDU
}
¿Cómo se indica el tamaño de un archivo depende de la aplicación. Por lo general, puede obtener el tamaño del archivo desde la estructura de información de control de archivos (FCI) devuelta por un SELECT en el EF (00 A4 00 00 02 fileId
). Sin embargo, el tamaño del archivo también puede estar incrustado en el contenido del archivo. Si es posible, no debe confiar en las palabras de estado para decirle el tamaño del archivo.
Adición: Le, Ne y extraña INS
Es importante que sólo aumenta el offset con la cantidad de bytes que se recibe realmente dentro de los datos de respuesta (RDATA). Tenga en cuenta que si P3 = Le que Le codifica Ne, que es , el tamaño máximo de los datos de respuesta. Puede recibir menos que eso.
Si el tamaño del archivo es 32Ki o más, necesita utilizar LEER BINARIO con INS impar (B7
) para leer los datos superiores a 32Ki. En ese caso, el RDATA también puede contener gastos generales. Obviamente eso, a su vez, puede influir en los cálculos de compensación y los cálculos para leer hasta el final del archivo.
P3 no es la cantidad de bytes que deben leerse. Mantiene Le, que es la codificación del número máximo de bytes que se devolverán en la APDU de respuesta. Es casi lo mismo. –
depende de a quién le preguntes realmente. Pasé demasiado tiempo con las especificaciones de GSM, donde 'P3' = Longitud, pero tu punto sigue siendo bueno, la mayoría de las personas usa' Le' y está_ más claro. – pb2q
Eso no fue un ataque a su postura. El problema es que muchos creadores de especificaciones no entienden la diferencia, por lo que de forma predeterminada se ha convertido en una de las dos (o, a veces, en una combinación de ambas). –