Sie können nach dem ersten Wert suchen, der ist nicht Wert -1, beginnend mit dem Ende. Sie verwenden dann eine der Methoden Arrays
, um die verbleibenden Werte in ein neues Array zu kopieren. Da das Array definitiv weniger als 65KB und wahrscheinlich weniger als 256 Bytes ist, wäre das in Bezug auf Speicher oder Geschwindigkeit egal. Sie könnten auch einfach die Länge speichern oder das Ergebnis in eine passende Größe von ByteBuffer
umwandeln, wenn Sie die Bytes wirklich nicht kopieren möchten.
Also hier ist etwas Java-Code, um darüber zu tun. Beachten Sie, dass die Methoden privat gemacht werden, da ich die Werte start
& end
nicht testen (sie könnten um oder negativ geschaltet werden). Möglicherweise möchten Sie auch einige Tests mit unterschiedlichen Werten und anderen allgemeinen Grenzwerten einbeziehen.
Dieser Code überprüft nicht, ob die Werte im Bereich definiert in der Frage sind.
private static final byte PADDING_BYTE = (byte) 0xFF;
private static int determineUnpaddedEnd(byte[] array, int start, int end) {
// end is exclusive
int paddingOffset = end - 1;
while (paddingOffset >= start
&& array[paddingOffset] == PADDING_BYTE) {
paddingOffset--;
}
// returns either start or the location of the last padding byte
return paddingOffset + 1;
}
private static byte[] removePadding(byte[] array) {
int unpaddedEnd = determineUnpaddedEnd(array, 0, array.length);
return Arrays.copyOf(array, unpaddedEnd);
}
private static ByteBuffer removePadding(ByteBuffer buf) {
int start = buf.position();
int paddingOffset = buf.limit() -1;
while (paddingOffset >= start
&& buf.get(paddingOffset) == PADDING_BYTE) {
paddingOffset--;
}
buf.limit(paddingOffset + 1);
return buf;
}
public static void main(String[] args) {
Map<byte[], Integer> testVectors = new HashMap<>();
testVectors.put(new byte[0], 0);
testVectors.put(new byte[] {-1}, 0);
testVectors.put(new byte[] {1, -1}, 1);
testVectors.put(new byte[] {83, 97, 103, 117, 110, -1, -1, -1}, 5);
int testcase = 1;
for (Entry<byte[], Integer> test : testVectors.entrySet()) {
System.out.println(testcase++);
byte[] array = test.getKey();
int value = determineUnpaddedEnd(array, 0, array.length);
if (value != test.getValue()) {
throw new IllegalStateException("Maarten cannot program anymore");
}
System.out.println(Arrays.toString(removePadding(array)));
System.out.println(removePadding(ByteBuffer.wrap(array)));
}
}
Der bessere Weg ist wahrscheinlich die FCP Informationen mit den richtigen ISO 7816-4 SELECT
Befehl auszulesen, die die Länge der Datei enthält gelesen werden. Dies setzt voraus, dass Ihre Smartcard-Implementierung diesem Format entspricht und die Daten in einer elementaren Datei vorliegen. Wenn die Dateigröße größer als die in der Datei enthaltene Information ist, kann man nur hoffen, dass das Protokoll die Größe irgendwie definiert.
Werfen Sie einen Blick [hier] (http://stackoverflow.com/a/17004488/5128464) und [hier] (http://stackoverflow.com/a/7668864/5128464) (und ersetzen '0'/'32' mit' -1') ... Viel Glück! – vlp
Es ist zu beachten, dass der Wert -1 dasselbe ist wie 0xFF, wenn er als vorzeichenlose Bytes betrachtet wird, d. H. Es ist ein Byte mit allen gesetzten Bits, dargestellt in Zweierkomplementform. Die Tatsache, dass alle Bits gesetzt sind, ist wahrscheinlich die * Bedeutung * des Wertes, also würde ich lieber mit "(Byte) 0xFF" als eine Konstante in meinem Code vergleichen. –