es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Si es así, entonces el código debería cambiarse a:

    assertThat(minimalExample("\r\u0085")).isEqualTo(" ");
    

    y el método minimal 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");
    }
    

    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:

    assertThat(minimalExample("\r\n")).isEqualTo(" ");
    

    debería pasar, dado un método mínimo definido como sigue:

    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");
    }
    

    Lo que termino obteniendo es:

    Expecting: 
     "<lf>"
    to be equal to: 
     "<sp><sp>"
    but was not.
    

    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:

    assertThat(minimalExample("\r\u0085")).isEqualTo(" ");
    

    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");
    }

Comments are closed.