org.kapott.hbci.manager.MatrixCode Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of hbci4j-adorsys Show documentation
Show all versions of hbci4j-adorsys Show documentation
HBCI4j - Home Banking Computer Interface for Java - Clone from https://github.com/hbci4j/hbci4java
/**********************************************************************
*
* Copyright (c) by Olaf Willuhn
* All rights reserved
*
**********************************************************************/
package org.kapott.hbci.manager;
import static org.kapott.hbci.comm.CommPinTan.ENCODING;
/**
* Klasse zum Parsen von Matrix-Codes.
*/
public class MatrixCode {
private String mimetype = null;
private byte[] image = null;
/**
* ct.
*
* @param data die Rohdaten aus dem HHDuc als String.
* @throws Exception wenn die Daten nicht als Bild geparst werden konnten.
*/
public MatrixCode(String data) throws Exception {
this(data != null ? data.getBytes(ENCODING) : null);
}
/**
* ct.
*
* @param data die Rohdaten aus dem HHDuc als Byte-Array.
* @throws Exception wenn die Daten nicht als Bild geparst werden konnten.
*/
public MatrixCode(byte[] data) throws Exception {
if (data == null || data.length < 100)
throw new Exception("invalid matrix code");
int offset = 0;
// Mime-Type
{
byte[] b = new byte[2];
System.arraycopy(data, offset, b, 0, 2);
int len = Integer.parseInt(this.decode(b));
b = new byte[len];
offset += 2;
System.arraycopy(data, offset, b, 0, len);
this.mimetype = new String(b, ENCODING);
offset += len;
}
// Bild-Daten
{
// Die Groesse brauchen wir hier nicht ermitteln,
// weil das Bild ja genau bis zum Ende des Byte-Array geht
offset += 2;
int len = data.length - offset;
byte[] b = new byte[len];
System.arraycopy(data, offset, b, 0, len);
this.image = b;
}
}
/**
* Versucht den Text als Matrix-Code zu parsen.
*
* @param data die zu parsenden Daten.
* @return der Matrix-Code, wenn er lesbar war, sonst NULL.
*/
public static MatrixCode tryParse(String data) {
try {
return new MatrixCode(data);
} catch (Exception e) {
return null;
}
}
/**
* Decodiert die Bytes als String.
*
* @param bytes die Bytes.
* @return der String.
*/
private String decode(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < bytes.length; ++i) {
sb.append(Integer.toString(bytes[i], 10));
}
return sb.toString();
}
/**
* Liefert die Rohdaten des Bildes.
*
* @return image die Rohdaten des Bildes.
*/
public byte[] getImage() {
return image;
}
/**
* Liefert den Mimetype des Bildes.
*
* @return mimetype
*/
public String getMimetype() {
return mimetype;
}
}