Avatar billede fanatic Nybegynder
17. august 2010 - 14:29 Der er 3 kommentarer og
1 løsning

Opdeling af bytearray i blokke hvor specielle tegn driller

Hej.

Jeg har en klasse "StringToken" som indeholder et byte-array med strengen (blot til test): ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ

I en anden klasse har jeg en metode som modtager denne "StringToken" som parameter. Denne metode henter hele byte-arrayet som vist herunder:

byte[] string = stringToken.getByteArray();

Indholdet af dette array er:

[-61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104, -61, -104]

Mit problem er at nogle tegn fylder 2 bytes som eks. et "Ø". Hensigten med metoden er nemlig at splitte hele arrayet op i blokke af maks 64 bytes (spørg mig ikke hvorfor). Der vises af og til mystiske tegn i output'et og jeg ved nu at det er fordi, at den kan finde på at splitte en blok på 64 bytes imellem de to bytes, der danner eksempelvis et Ø.

Findes der en måde hvorpå at jeg kan splitte ved eksempelvis 63 hvis den karakter, der står i enden fylder 2 bytes (således at den ene byte ikke kommer til at stå i enden på den ene blok og den anden byte i starten på næste blok)?
Hvordan ved jeg at de to bytes hænger sammen? Hvordan kan et tjek laves?
Avatar billede arne_v Ekspert
17. august 2010 - 19:56 #1
Proev split3 metoden i denne kode:

package august;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

public class SmartSplit {
    public static List<List<Byte>> split1(String s, int maxlen) throws UnsupportedEncodingException {
        List<List<Byte>> res = new ArrayList<List<Byte>>();
        int ix = 0;
        while(ix < s.length()) {
            int d = Math.min(s.length() - ix, maxlen);
            byte[] ba = s.substring(ix, ix + d).getBytes("UTF-8");
            List<Byte> tmp = new ArrayList<Byte>();
            for(byte b : ba) {
                tmp.add(b);
            }
            res.add(tmp);
            ix += d;
        }
        return res;
    }
    public static List<List<Byte>> split2(String s, int maxlen) throws UnsupportedEncodingException {
        List<List<Byte>> res = new ArrayList<List<Byte>>();
        byte[] ba = s.getBytes("UTF-8");
        int ix = 0;
        while(ix < ba.length) {
            int d = Math.min(ba.length - ix, maxlen);
            List<Byte> tmp = new ArrayList<Byte>();
            for(int i = 0; i < d; i++) {
                tmp.add(ba[ix + i]);
            }
            res.add(tmp);
            ix += d;
        }
        return res;
    }
    public static List<List<Byte>> split3(String s, int maxlen) throws UnsupportedEncodingException {
        List<List<Byte>> res = new ArrayList<List<Byte>>();
        List<Byte> tmp = new ArrayList<Byte>();
        for(int i = 0; i < s.length(); i++) {
            byte[] ba = s.substring(i, i + 1).getBytes("UTF-8");
            if(tmp.size() + ba.length > maxlen) {
                res.add(tmp);
                tmp = new ArrayList<Byte>();
            }
            for(byte b : ba) {
                tmp.add(b);
            }
        }
        if(tmp.size() > 0) {
            res.add(tmp);
        }
        return res;
    }
    public static void main(String[] args) throws UnsupportedEncodingException {
        String s = "ØØØØØ";
        System.out.println("char split:");
        List<List<Byte>> p1 = split1(s, 3);
        for(List<Byte> lst : p1) {
            for(byte b : lst) {
                System.out.print(" " + b);
            }
            System.out.println();
        }
        System.out.println("byte split:");
        List<List<Byte>> p2 = split2(s, 3);
        for(List<Byte> lst : p2) {
            for(byte b : lst) {
                System.out.print(" " + b);
            }
            System.out.println();
        }
        System.out.println("char byte split:");
        List<List<Byte>> p3 = split3(s, 3);
        for(List<Byte> lst : p3) {
            for(byte b : lst) {
                System.out.print(" " + b);
            }
            System.out.println();
        }
    }
}
Avatar billede arne_v Ekspert
17. august 2010 - 19:57 #2
Jeg bruger List og ikke array, fordi det er lidt nemmere at arbejde med, men du kan konvertere til array hvis du skal bruge det.
Avatar billede fanatic Nybegynder
18. august 2010 - 20:31 #3
Tak for hjælpen. Lægger du et svar?
Avatar billede arne_v Ekspert
18. august 2010 - 20:52 #4
kommer her
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester