Løsningsforslag - oppgaver i Vedlegg A.3.12


Oppgave 1

byte = 1, int = 4, double = 8 og boolean = 1, tilsammen 14. Det brukes 2 byter til å angi antall byter som tegnstrengen blir representert med (her 9), så 3 byter for A, B og C og til slutt 6 byter for Æ, Ø og Å. Dermed 25 byter sammenlagt.

Metoden readUTF()() starter med å lese to byter og vet deretter hvor mange av de videre bytene som hører til tegnstrengen. Så leses neste byte. Hvis den starter med en 0 bit, så gjøres den om til en char der første byte er 0 og neste byte er den som ble lest. Hvis den som ble lest isteden starter med en 1-bit, så leses også neste byte. Tegnet (char-verdien) blir konstruert ved hjelp av disse to bytene.

Eksempel: Anta at Å inngår i tegnstrengen. Den har tallverdi 197 og er som char-verdi representert slik: 0000000011000101. Metoden writeUTF()() kan ikke skrive ut dette som først 00000000 og så 11000101. Da vil jo den første byten starte med en 0-bit. De 16 bitene må isteden «stokkes om» slik at det garanter blir en 1-bit først i den første av de to bytene som skal skrives ut. Det er laget slik at den første da starter med 11. La ch være en char-verdi. Da vil de to første bytene bli konstruert slik:

    1. byte: (byte)(0xc0 | (0x1f & (ch >> 6)))
    2. byte: (byte)(0x80 | (0x3f & ch))

Lar vi ch = 'Å', vil 1. byte bli 11000011 og 2.byte 10000101. Regnet med fortegn blir det -61 og -123. I readUTF()() blir dette regnet tilbake til 'Å'.

Flg. metode gjelder kun for nulltegnet (tegnet med 0 som tallverdi) og for tegn med tallverdi i intervallet 128 til 2047. For char-verdier med tallverdi fra 2048 gjelder andre formeler. Slike verdier skrives ut med tre byter.

  public static String tilUTF8(char ch)
  {
    byte en = (byte)(0xc0 | (0x1f & (ch >> 6)));
    byte to = (byte)(0x80 | (0x3f & ch));

    StringBuilder s = new StringBuilder();
    s.append(en).append(" ").append(to).append("  ");
    s.append(Integer.toBinaryString(Byte.toUnsignedInt(en)));
    s.append(" ");
    s.append(Integer.toBinaryString(Byte.toUnsignedInt(to)));

    return s.toString();
  }

  public static void main(String[] args) throws IOException
  {
    System.out.println(tilUTF8('Æ'));     // -61 -122  11000011 10000110
    System.out.println(tilUTF8('Ø'));     // -61 -104  11000011 10011000
    System.out.println(tilUTF8('Å'));     // -61 -123  11000011 10000101
    System.out.println(tilUTF8((char)0)); // -64 -128  11000000 10000000
  }