Originariamente inviato da andbin
I codici ASCII vanno da 0x00 a 0x7F. Quindi 0x99 (153 in decimale) non è ASCII e cosa sia .... dovresti precisarlo. Tra l'altro non è nemmeno un codice valido nel latin-1 (ISO-8859-1).
Non so chi/cosa faccia convertire il carattere nella numeric entity
™
Facendo:
sb.append((char)decimal);
in quel buffer sb hai 1 char che ha codice 153. Punto. Nulla che riguarda le entity. Dove poi usi e a cosa passi questo buffer .... non lo so. Non l'hai detto, non hai precisato altro, non hai mostrato altro codice.
Presumo stai usando una API, libreria o altro che codifica anche le entity HTML. Ma se non dici cosa ....... non sono un oracolo.
Ok, scusami…credevo che non fosse necessario specificare di più…
Allora io possiedo un file che all’interno contiene delle stringhe del tipo di quelle che ho riportato nel primo post.
Queste stringhe sono state ottenute da caratteri ascii converiti in esadecimale. Questi caratteri ascii erano il risultato di un processo di crittografia con algoritmo “triple DES”.
Ora io devo fare il processo inverso…cioè prendere queste stringhe in esadecimale, convertirle in ascii e decriptarle con lo stesso algoritmo (ovviamente con la stessa chiave).
So bene che i codici ascii vanno nell’intervallo da te specificato, ma quel “99” (come anche altri codici che vanno oltre al 0x7F) esiste nel file e non so come sia stato ottenuto (se non con il processo specificato prima)!
Il codice in sintesi è il seguente:
codice:
//prende la stringa e la formatta togliendogli i trattini e gli spazi
String plaintxt = formatter(encryptText);
char[] ch1 = plaintxt.toCharArray();
//ho provato a usare vari charset
b64cipher = new String(HEXUtility.decodeHex(ch1),"ISO-8859-15");
//decodifica
codec = new String(cipher(b64cipher.getBytes(), Cipher.DECRYPT_MODE),"ISO-8859-15").trim();
La HEXUtility.decodeHex è la seguente (questa è la prima versione che ho usato):
codice:
/**
* Metodo utilizzato per decodificare il codice HEX e convertirlo in byte
* @param data: in ingresso si richiede un array di char,verranno presi a coppie di due
* @return un array di byte corrispondenti al valore effettivo del dato
*/
public static byte[] decodeHex(char[] data) throws DecoderException {
int len = data.length;
if ((len & 0x01) != 0) {
throw new DecoderException("Numero dei caratteri non corretto");
}
byte[] out = new byte[len >> 1];
// due caratteri per HEX
for (int i = 0, j = 0; j < len; i++) {
int f = toDigit(data[j], j) << 4;
j++;
f = f | toDigit(data[j], j);
j++;
out[i] = (byte) (f & 0xFF);
}
return out;
}
/**
* metodo d'appoggio per la decodifica degli HEX
*/
protected static int toDigit(char ch, int index) throws DecoderException {
int digit = Character.digit(ch, 16);
if (digit == -1) {
throw new DecoderException("Carattere HEX non corretto " + ch + " alla posizione " + index);
}
return digit;
}
Ciao e ancora grazie,