EBCDIC (Cp1047) junit 0D25 EBCDIC (Cp1047) junit 0D25
Estoy trabajando con algunos datos codificados en EBCDIC y se me exige reemplazar algunos de los valores.
Uno de los valores son los bytes hexadecimales 0D 25 que deben convertirse en 40 40.
Entiendo que esto significa que los caracteres EBCDIC son los siguientes:
0D: retorno de carro
25: avance de línea
Este par, cuando se encuentra en una cadena con esta codificación, debe reemplazarse por dos espacios (hex 40, dos veces). Consulte también la tabla de caracteres EDCDIC de Wikipedia.
Entiendo que 0D (retorno de carro) es equivalente a \r y que 25 (avance de línea) es (debería ser?) \n en UTF-16. Por lo tanto:
assertThat(minimalExample(“\r\n”)).isEqualTo(” “);
debería pasar, dado un método mínimo definido de la siguiente manera:
String minimalExample(String raw) throws Exception {
byte[] bytes = raw.getBytes(“Cp1047”);
if (bytes[0] == 0x0d && bytes[1] == 0x25) {
bytes[0] = 0x40;
bytes[1] = 0x40;
}
return new String(bytes, “Cp1047″);
}
Pero lo que termino obteniendo es:
Esperando:
<”
“>
ser igual a:
<” “>
pero no lo es.
Porque el segundo valor hexadecimal para la cadena dada es 15 (no 25 como pensé que sería).
Parece que 25 se representa en UTF-16 como \u0085.
¿Es esto correcto?
davy.ai
Si es así, entonces el código debería cambiarse a:
y el método minimal debería cambiarse a:
Entiendo que esto significa que los caracteres EBCDIC son los siguientes:
– 0D: retorno de carro
– 15: salto de línea
Esta pareja cuando se encuentra en un String con esta codificación debe ser reemplazada por dos espacios (hex 40, dos veces). Ver también la tabla de caracteres EBCDIC de wikipedia.
Entiendo que 0D (retorno de carro) es equivalente a \r y 15 (salto de línea) es (debería ser?) \n en UTF-16. Por lo tanto:
debería pasar, dado un método mínimo definido como sigue:
Lo que termino obteniendo es:
Porque el segundo valor hexadecimal de la cadena dada es 15 (no 25 como pensé que sería).
Parece que 25 se representa en UTF-16 como \u0085.
¿Es esto correcto? Si es así, entonces el código debería cambiarse a:
y el método mínimo debería cambiarse a:
String minimalExample(String raw) throws Exception {
byte[] bytes = raw.getBytes("Cp1047");
if (bytes[0] == 0x0d && bytes[1] == 0x15) {
bytes[0] = 0x40;
bytes[1] = 0x40;
}
return new String(bytes, "Cp1047");
}