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 }