[Java 1.3] Replace doen in byte array

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Deddiekoel
  • Registratie: Maart 2000
  • Laatst online: 16-09 16:34

Deddiekoel

Gadget nerd

Topicstarter
Ik heb een probleem waar ik niet goed uit kom.
Ik heb een java object (om precies te zijn een message object) dat ik moet aanpassen. In het object zit nl. een naam (in de vorm "schema.tabel") die een punt bevat en ik moet die punt vervangen met een underscore (resultaat moet dus "schema_tabel" zijn).

Probleem is het volgende. Ik kan de message converteren naar een byte array en kan van die byte array hem ook weer construeren. Het probleem is dat ik er ook geen String van kan maken want dan krijg ik een error bij het herconstrueren. Om het allemaal helemaal mooi te maken moet het allemaal in Java 1.3 draaien!
Het gaat wel maar om een enkele replace. Er is een instantie van die punt en die moet vervangen worden.

Ik denk dat ik het kan oplossen door in de byte array de index van de zoekterm te vinden en dan daarmee de precieze index van de te vervangen byte kan vinden en die vervangen. Ik weet alleen niet hoe ik dit kan doen in Java (1.3)....
Weet iemand hier hoe dit probleem is aan te pakken?

Verlanglijstje: Switch 2, PS5 Pro Most wanted: Switch 2


Acties:
  • 0 Henk 'm!

  • jAnO!
  • Registratie: Januari 2002
  • Laatst online: 28-01 13:12

jAnO!

lalalavanillevla

Heb je de code, want anders kan ik niet verzinnen waarom je bij het "terugconverteren" een fout krijgt als je een String replace gebruikt.

When some people work at a place for ten years they get ten years of experience, other people work at a place for ten years and get one year of experience ten times.


Acties:
  • 0 Henk 'm!

  • Deddiekoel
  • Registratie: Maart 2000
  • Laatst online: 16-09 16:34

Deddiekoel

Gadget nerd

Topicstarter
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    public static String replaceAll(String source, String toReplace, String replacement) {
        int idx = source.lastIndexOf(toReplace);
        if (idx != -1) {
            StringBuffer ret = new StringBuffer(source);
            ret.replace(idx, idx + toReplace.length(), replacement);
            while ((idx = source.lastIndexOf(toReplace, idx - 1)) != -1) {
                ret.replace(idx, idx + toReplace.length(), replacement);
            }
            source = ret.toString();
        }
 
        return source;
    }
 
    public Object replaceByte(TibrvMsg msg, String toReplace, String replacement) throws Exception {   
        byte[] msgBytes = msg.getAsBytes();
        String msgString = new String(msgBytes);
        msgString = replaceAll(msgString, toReplace, replacement);
        msg = new TibrvMsg(msgBytes);
        return msg;
    }

Het probleem lijkt vooral in de conversie naar String te zitten want ook zonder de ReplaceAll will hij niet meer een nieuw msg object maken.

Om het verder nog interessant te maken. Er zal data van verschillende codepages hier doorheen moeten (met name russische tekst, codepage 1025 meen ik)

[ Voor 6% gewijzigd door Deddiekoel op 26-11-2008 11:35 ]

Verlanglijstje: Switch 2, PS5 Pro Most wanted: Switch 2


Acties:
  • 0 Henk 'm!

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
In je replaceByte doe je uiteindelijk niks met je String. Die TibrvMsg die je terugkrijgt is eigenlijk gewoon een copy van de oorsponkelijke msg.

Acties:
  • 0 Henk 'm!

  • NetForce1
  • Registratie: November 2001
  • Laatst online: 26-09 22:37

NetForce1

(inspiratie == 0) -> true

Waarom je een error krijgt weet ik zo niet (welke error krijg je?) maar ik zie wel twee zaken die fout zijn:
1. Als je met verschillende codepages werkt moet je dat ook doorgeven aan de constructor van String, anders gebruikt ie de platform default.
2. Je returned je originele byte array, daar staat natuurlijk niet-gereplacede data in, je zult msgString.getBytes() moeten gebruiken.

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


Acties:
  • 0 Henk 'm!

  • Deddiekoel
  • Registratie: Maart 2000
  • Laatst online: 16-09 16:34

Deddiekoel

Gadget nerd

Topicstarter
Oops dit was de test code. DIt om te testen of de error kwam door de string of niet. Met bovenstaande code gaat alles goed maar is er niet vanvangen!
Probleemcode is:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public static String replaceAll(String source, String toReplace, String replacement) {
        int idx = source.lastIndexOf(toReplace);
        if (idx != -1) {
            StringBuffer ret = new StringBuffer(source);
            ret.replace(idx, idx + toReplace.length(), replacement);
            while ((idx = source.lastIndexOf(toReplace, idx - 1)) != -1) {
                ret.replace(idx, idx + toReplace.length(), replacement);
            }
            source = ret.toString();
        }
 
        return source;
    }
 
    public Object replaceByte(TibrvMsg msg, String toReplace, String replacement) throws Exception {   
        byte[] msgBytes = msg.getAsBytes();
        String msgString = new String(msgBytes);
        msgString = replaceAll(msgString, toReplace, replacement);
        msg = new TibrvMsg(msgString.getBytes());
        return msg;
    }

Verlanglijstje: Switch 2, PS5 Pro Most wanted: Switch 2


Acties:
  • 0 Henk 'm!

  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 08:49

voodooless

Sound is no voodoo!

Bevat die message alleen maar String data? Zonee, dan is een dergelijke replace wel erg gevaarlijk. Andere data die toevallig '.' bevat zal ook worden gereplaced, en dat zou je toch niet willen hebben.

Verder bevat String gewoon een replace(char oldChar, char newChar), lijkt me voor deze toepassing prima geschikt (als bovenstaande niet op gaat).

Do diamonds shine on the dark side of the moon :?


Acties:
  • 0 Henk 'm!

  • Deddiekoel
  • Registratie: Maart 2000
  • Laatst online: 16-09 16:34

Deddiekoel

Gadget nerd

Topicstarter
voodooless schreef op woensdag 26 november 2008 @ 11:49:
Bevat die message alleen maar String data? Zonee, dan is een dergelijke replace wel erg gevaarlijk. Andere data die toevallig '.' bevat zal ook worden gereplaced, en dat zou je toch niet willen hebben.

Verder bevat String gewoon een replace(char oldChar, char newChar), lijkt me voor deze toepassing prima geschikt (als bovenstaande niet op gaat).
Het gaat niet om een vervanging van alle punten. Ik gebruik deze functie met een toReplace en Replacement die een langere string bevatten (die van de hele naam). Het probleem zit hem dus dat ik de 'pattern' van toReplace in de byte array moet kunnen vinden om op basis daarvan de specifieke '.' te vervangen!

Verlanglijstje: Switch 2, PS5 Pro Most wanted: Switch 2


Acties:
  • 0 Henk 'm!

  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 08:49

voodooless

Sound is no voodoo!

Deddiekoel schreef op woensdag 26 november 2008 @ 12:47:
Het gaat niet om een vervanging van alle punten.
Welke punten replace je dan niet :?

Do diamonds shine on the dark side of the moon :?


Acties:
  • 0 Henk 'm!

  • Deddiekoel
  • Registratie: Maart 2000
  • Laatst online: 16-09 16:34

Deddiekoel

Gadget nerd

Topicstarter
voodooless schreef op woensdag 26 november 2008 @ 12:54:
[...]


Welke punten replace je dan niet :?
In de message staat een naam die er zo uit ziet "schema.tabel" en die moet veranderen in "schema_tabel".
Dat is de enige aanpassing die nodig is.

Verlanglijstje: Switch 2, PS5 Pro Most wanted: Switch 2


Acties:
  • 0 Henk 'm!

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Deddiekoel schreef op woensdag 26 november 2008 @ 11:07:
In het object zit nl. een naam (in de vorm "schema.tabel") die een punt bevat en ik moet die punt vervangen met een underscore (resultaat moet dus "schema_tabel" zijn).
Wat is er mis met het volgende:
Java:
1
2
3
String naam = "schema.tabel";
String aangepasteNaam = naam.replace('.', '_');
System.out.println(aangepasteNaam); // "schema_tabel" 
:?

[ Voor 6% gewijzigd door BalusC op 26-11-2008 13:41 ]


Acties:
  • 0 Henk 'm!

  • Deddiekoel
  • Registratie: Maart 2000
  • Laatst online: 16-09 16:34

Deddiekoel

Gadget nerd

Topicstarter
BalusC schreef op woensdag 26 november 2008 @ 13:40:
[...]

Wat is er mis met het volgende:
Java:
1
2
3
String naam = "schema.tabel";
String aangepasteNaam = naam.replace('.', '_');
System.out.println(aangepasteNaam); // "schema_tabel" 
:?
Dat ik die actie moet uitvoeren op een byte array die die String bevat zonder dat ik de byte array naar Strign converteer. Dus ik moet die replace doen binnen een byte array...

Verlanglijstje: Switch 2, PS5 Pro Most wanted: Switch 2


Acties:
  • 0 Henk 'm!

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Deddiekoel schreef op woensdag 26 november 2008 @ 13:58:
[...]

Dat ik die actie moet uitvoeren op een byte array die die String bevat zonder dat ik de byte array naar Strign converteer. Dus ik moet die replace doen binnen een byte array...
Waarom in hemelsnaam een tussenstap met een byte array? Lees je een txt bestand met dat string uit naar domweg een byte array ipv netjes een char array ofzo? Je gebruikt in je methodes toch een string. Het is niet nodig om de string de hele tijd te omzetten.

Anyway, het hangt allemaal ervan af welke charset je gebruikt. Als je de bytes van de punt en de underscore in de gewenste charset weet, dan kun je gewoon een replace doen van de gewenste bytes in de array.

[ Voor 16% gewijzigd door BalusC op 26-11-2008 14:03 ]


Acties:
  • 0 Henk 'm!

  • Deddiekoel
  • Registratie: Maart 2000
  • Laatst online: 16-09 16:34

Deddiekoel

Gadget nerd

Topicstarter
Ik heb inmiddels iets dat werkt maar vrees dat het wellicht niet helemaal 100% betrouwbaar is.
De code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
        byte[] msgBytes = msg.getAsBytes();
        String msgString = "";
        if(sources.length==5) msgString = new String(msgBytes, (String) sources[4].getValue());
        else msgString = new String(msgBytes, msg.getStringEncoding());       
        
        int patternIndex = msgString.indexOf(pattern);
        int index = patternIndex + Integer.parseInt(relativeIndex);
        byte value = msgBytes[index];
        byte[] replacementByte = replacement.getBytes();
        msgBytes[index] = replacementByte[0];
        
        msg = new TibrvMsg(msgBytes);
        return msg;

Wat ik dus doe is er toch een String van maken in deze string op zoek gaan naar mijn pattern. De index die ik terugkrijg modificeer ik met een relatieve index om de precieze locatie van het karakter binnen het pattern aan te geven. Deze uiteindelijke index gebruik ik vervolgens om binnen de byte array een byte vervangen!

Voor mijn test data werkt het maar in hoeverre is deze opzet betrouwbaar, bijvoorbeeld voor data die in een double byte encoding zit?

Verlanglijstje: Switch 2, PS5 Pro Most wanted: Switch 2


Acties:
  • 0 Henk 'm!

  • Deddiekoel
  • Registratie: Maart 2000
  • Laatst online: 16-09 16:34

Deddiekoel

Gadget nerd

Topicstarter
BalusC schreef op woensdag 26 november 2008 @ 14:00:
[...]

Waarom in hemelsnaam een tussenstap met een byte array? Lees je een txt bestand met dat string uit naar domweg een byte array ipv netjes een char array ofzo? Je gebruikt in je methodes toch een string. Het is niet nodig om de string de hele tijd te omzetten.

Anyway, het hangt allemaal ervan af welke charset je gebruikt. Als je de bytes van de punt en de underscore in de gewenste charset weet, dan kun je gewoon een replace doen van de gewenste bytes in de array.
Het TibrvMsg object (niet van mij afkomstig) werkt met een byte array. Dus om dat object te maken heb ik een byte array nodig. Dus vandaar de byte array...

Verlanglijstje: Switch 2, PS5 Pro Most wanted: Switch 2


Acties:
  • 0 Henk 'm!

  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 08:49

voodooless

Sound is no voodoo!

Dan gaat het inderdaad mis...

Maar we hebben al meerdere keren gevraagd waarom je met bytes bezig bent terwijl je strings wil replacen?

Waarom kun je het object wel weer opnieuw maken met een String i.p.v bytes?

Misschien is het handig om het bericht de deserializen, en dan de data aan te passen, om het daarna weer de serializen?

[ Voor 43% gewijzigd door voodooless op 26-11-2008 15:08 ]

Do diamonds shine on the dark side of the moon :?


Acties:
  • 0 Henk 'm!

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Ah ja. Dan geldt mijn laatste opmerking. Vind de charset uit. Vind de byte representaties van de punt en underscore in die charset uit. Dan weet je waarnaar je in de byte array moet zoeken en waarmee je het moet vervangen. Alternatively kun je ook de bytes omzetten naar string in die charset en dan String#replace() gebruiken en vervolgens weer terugzetten naar bytes.

[ Voor 24% gewijzigd door BalusC op 26-11-2008 15:09 ]


Acties:
  • 0 Henk 'm!

  • Deddiekoel
  • Registratie: Maart 2000
  • Laatst online: 16-09 16:34

Deddiekoel

Gadget nerd

Topicstarter
BalusC schreef op woensdag 26 november 2008 @ 15:07:
Ah ja. Dan geldt mijn laatste opmerking. Vind de charset uit. Vind de byte representaties van de punt en underscore in die charset uit. Dan weet je waarnaar je in de byte array moet zoeken en waarmee je het moet vervangen. Alternatively kun je ook de bytes omzetten naar string in die charset en dan String#replace() gebruiken en vervolgens weer terugzetten naar bytes.
Dat heb ik dus al geprobeerd maar blijkbaar wordt er bij de omzetting naar String toch iets aangepast.
Verder moet ik dus niet alle punten vervangen maar 1 hele specifieke, de array doorzoeken op een punt heeft derhalve geen zin. Ik moet precies de punt in een specifiek pattern vinden...

Verlanglijstje: Switch 2, PS5 Pro Most wanted: Switch 2


Acties:
  • 0 Henk 'm!

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Dan ben je van een verkeerde charset uitgegaan of heb je deze helemaal niet toegepast bij het omzetten, zodat het de OS' default charset pakt wat dus niet de juiste blijkt.

Acties:
  • 0 Henk 'm!

  • Deddiekoel
  • Registratie: Maart 2000
  • Laatst online: 16-09 16:34

Deddiekoel

Gadget nerd

Topicstarter
Ik gebruik altijd de charset die in het bericht staat aangegeven... Daar is nl. wel een methode voor.

Verlanglijstje: Switch 2, PS5 Pro Most wanted: Switch 2


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 09:32

Janoz

Moderator Devschuur®

!litemod

Deddiekoel schreef op woensdag 26 november 2008 @ 15:23:
[...]

Dat heb ik dus al geprobeerd maar blijkbaar wordt er bij de omzetting naar String toch iets aangepast.
Verder moet ik dus niet alle punten vervangen maar 1 hele specifieke, de array doorzoeken op een punt heeft derhalve geen zin. Ik moet precies de punt in een specifiek pattern vinden...
Een patroon kun je net zo goed in een bytearray vinden. Gewoon lineaur door de bytearray lopen en kijken of je de eerste byte tegenkomt. Als dat het geval is kijk je of de volgende bytes ook overeenkomen met je patroon en als je een match hebt pas je de juiste byte aan.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Deddiekoel
  • Registratie: Maart 2000
  • Laatst online: 16-09 16:34

Deddiekoel

Gadget nerd

Topicstarter
Janoz schreef op woensdag 26 november 2008 @ 15:47:
[...]

Een patroon kun je net zo goed in een bytearray vinden. Gewoon lineaur door de bytearray lopen en kijken of je de eerste byte tegenkomt. Als dat het geval is kijk je of de volgende bytes ook overeenkomen met je patroon en als je een match hebt pas je de juiste byte aan.
Dat ga ik ook nog even proberen! Dan blijf ik tenminste zuiver in byte array!

Verlanglijstje: Switch 2, PS5 Pro Most wanted: Switch 2


Acties:
  • 0 Henk 'm!

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Dat heb ik al eerder gesuggereerd hoor 8)7 Je moet alleen nog steeds de juiste charset weten zodat je de juiste byte representaties van de punt en de underscore weet.

[ Voor 59% gewijzigd door BalusC op 26-11-2008 16:11 ]


Acties:
  • 0 Henk 'm!

  • Deddiekoel
  • Registratie: Maart 2000
  • Laatst online: 16-09 16:34

Deddiekoel

Gadget nerd

Topicstarter
Heb nu de volgende code (ben even paar dagen int buitenland geweest).
Deze is om de pattern te matchen:
Java:
1
2
3
4
5
6
7
    private static boolean matchPattern(byte[] source, int startIndex, byte[] pattern){
        for(int i=0; i<pattern.length; i++){
            int srcIndex = i+startIndex;
            if(pattern[i]!=source[srcIndex]) return false;
        }
        return true;
    }

En de volgende code is voor het zoorzoeken:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
        String encoding = msg.getStringEncoding();
        System.out.println("Received message with encoding "+encoding);
        int relativeIndex = 0;
        if(sources[2].getValue() instanceof String)  relativeIndex = pattern.indexOf((String) sources[2].getValue());
        else {
            Integer tmp = (Integer) sources[2].getValue();
            relativeIndex = tmp.intValue();
        }
        byte[] msgBytes = msg.getAsBytes();
        byte[] pttrnBytes = pattern.getBytes(encoding);
        byte searchByte = pttrnBytes[0];
        for(int i=0; i<msgBytes.length; i++){
            if(msgBytes[i]==searchByte){
                if(matchPattern(msgBytes, i, pttrnBytes)) {
                    //System.out.println("Pattern found at index: "+i);
                    int index = i + relativeIndex;
                    byte[] replacementByte = replacement.getBytes(encoding);
                    msgBytes[index] = replacementByte[0];
                    break;
                }
            }
        }
        
        msg = new TibrvMsg(msgBytes);
        return msg;

Verlanglijstje: Switch 2, PS5 Pro Most wanted: Switch 2


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
De code die je nu hebt werkt ieder geval niet altijd goed ( als je een multi byte encoding hebt ).

maar wat werkt er niet als je het volgende hebt?

Java:
1
2
3
4
String encoding = msg.getMessageEncoding();
String strMessage = new String( msg.getBytes(), encoding );
strMessage = strMessage.replace( '.', '_' );
msg = new TibrvMsg( strMessage.getBytes( encoding ) );

Als dit niet goed werkt moet je even debuggen wat strMessage.getBytes terug geeft en wat daar niet aan klopt. Mischien klopt de encoding niet.

Mij lijkt de code die ik hierboven type ieder geval een stuk duidelijker dan de code die je nu hebt.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 26-09 17:47
Ik denk dat ik hetzelfde bedoel als rwb, maar here goes:
Wat nu als je ontdekte pattern 'toevallig' voorkomt in de tekst als onderdeel van twee tekens.

Stel je voor: Het patroon wat je zoekt is 0x20 0x24 en in de tekst komt 0x18 0x20 0x24 0x28 voor, die beide 1 teken van 2 bytes voorstellen. Je replace- functie vernaggelt dan de tekst. Je zult moeten uitzoeken of het patroon echt is voor de punt.

Voor multi-byte encodings an sich is dat niet zo moeilijk (uit te vinden met i % <bytes_per_teken> == 0), maar met encodings die variabele lengtes kennen (UTF-8) ontkom je er niet aan om de hele string te parsen.

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Jaap-Jan schreef op maandag 01 december 2008 @ 21:25:
Voor multi-byte encodings an sich is dat niet zo moeilijk (uit te vinden met i % <bytes_per_teken> == 0), maar met encodings die variabele lengtes kennen (UTF-8) ontkom je er niet aan om de hele string te parsen.
Het kan natuurlijk wel met alleen bytes, maar ieder geval niet op de manier dat de TS nu heeft.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Deddiekoel
  • Registratie: Maart 2000
  • Laatst online: 16-09 16:34

Deddiekoel

Gadget nerd

Topicstarter
Het probleem dat ik heb is dat als ik het naar een String parse en er daarna weer een message van maak die nieuwe message niet meer wordt geaccepteerd.
Maar ik zal bovenstaande code nog eens proberen.

Verlanglijstje: Switch 2, PS5 Pro Most wanted: Switch 2


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Deddiekoel schreef op dinsdag 02 december 2008 @ 10:34:
Het probleem dat ik heb is dat als ik het naar een String parse en er daarna weer een message van maak die nieuwe message niet meer wordt geaccepteerd.
Maar ik zal bovenstaande code nog eens proberen.
Maar de vraag is dus waarom hij niet geaccepteerd word. Dan is blijkbaar de byte representatie niet goed. Want uiteindelijk ben je precies hetzelfde aan het doen.

Als je een string weer terug converteerd naar een byte array dan zou je precies hetzelfde moeten hebben als dat je direct op de byte array werkt.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Deddiekoel
  • Registratie: Maart 2000
  • Laatst online: 16-09 16:34

Deddiekoel

Gadget nerd

Topicstarter
rwb schreef op maandag 01 december 2008 @ 19:44:
De code die je nu hebt werkt ieder geval niet altijd goed ( als je een multi byte encoding hebt ).

maar wat werkt er niet als je het volgende hebt?

Java:
1
2
3
4
String encoding = msg.getMessageEncoding();
String strMessage = new String( msg.getBytes(), encoding );
strMessage = strMessage.replace( '.', '_' );
msg = new TibrvMsg( strMessage.getBytes( encoding ) );

Als dit niet goed werkt moet je even debuggen wat strMessage.getBytes terug geeft en wat daar niet aan klopt. Mischien klopt de encoding niet.

Mij lijkt de code die ik hierboven type ieder geval een stuk duidelijker dan de code die je nu hebt.
Deze code werkt wel!
Als ik hiermee de msg aanpas komt hij er goed uit.

Nu wil ik graag nog een stap verder gaan en het bericht wegzetten in een andere encoding.
Ik heb nu geprobeerd om de msg aan te maken met: msg = new TibrvMsg( strMessage.getBytes( <nieuwe encoding> ) ); maar dan wordt het nieuwe object niet aangemaakt.

Is dit ook de goede manier om dit aan te pakken? Of moet ik iets anders doen om tot een andere encodering te komen. Expliciet krijg ik nu data binnen in cp1252 en ik wil wegschrijven in UTF-8.

Verlanglijstje: Switch 2, PS5 Pro Most wanted: Switch 2


Acties:
  • 0 Henk 'm!

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Deze code werkt wel!
Geesh, dit was jou al véél eerder gesuggereerd 8)7

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Deddiekoel schreef op donderdag 04 december 2008 @ 14:41:
[...]
Is dit ook de goede manier om dit aan te pakken? Of moet ik iets anders doen om tot een andere encodering te komen. Expliciet krijg ik nu data binnen in cp1252 en ik wil wegschrijven in UTF-8.
Dat ligt er natuurlijk aan in welke encoding zo'n TibrvMsg zijn data verwacht, aangezien de message blijkbaar ook een encoding property heeft, kun je die mischien wel in een overload van de constructor meegeven?

Java:
1
TibrvMsg newMessage = new TibrvMsg( myMessageString.getBytes( newEncoding ), newEncoding );

Maar dat zou je dus aan de leverancier van de class moeten vragen ( of in de documentatie opzoeken natuurlijk ).

Snap je nou eigenlijk al wel wat er anders is aan de code die je nu gebruikt, dan de code die je eerst had? Ik heb het idee dat je het concept "encoding" nog niet volledig begrijpt.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Deddiekoel
  • Registratie: Maart 2000
  • Laatst online: 16-09 16:34

Deddiekoel

Gadget nerd

Topicstarter
rwb schreef op donderdag 04 december 2008 @ 15:50:
[...]

Dat ligt er natuurlijk aan in welke encoding zo'n TibrvMsg zijn data verwacht, aangezien de message blijkbaar ook een encoding property heeft, kun je die mischien wel in een overload van de constructor meegeven?

Java:
1
TibrvMsg newMessage = new TibrvMsg( myMessageString.getBytes( newEncoding ), newEncoding );

Maar dat zou je dus aan de leverancier van de class moeten vragen ( of in de documentatie opzoeken natuurlijk ).

Snap je nou eigenlijk al wel wat er anders is aan de code die je nu gebruikt, dan de code die je eerst had? Ik heb het idee dat je het concept "encoding" nog niet volledig begrijpt.
Ik snap het wel en ook het verschil. Even voor de duidelijkheid om de bytes uit lezen moet je weten welke codepage je moet gebruiken om de juiste representatie te vinden. Een String in Java is altijd UTF-16 en dus worden de bytes geconverteerd naar UTF-16. Als je gaat wegschrijven naar bytes moet je dus weer de juiste encodering meegeven.

Maar helaas was ik te snel met het roepen dat het werkte want dat doet het nog steeds niet. Het TibrvMsg object wordt wel gemaakt maar de inhoud wordt verderop niet geaccepteerd...

Waarschijnlijk komt dit echter omdat de input msg ook al verkeerd is. De bron is codepage cp1025 maar komt binnen als cp1252. Ik denk dat de String conversie daarop stuk loopt.

Is er uberhaubt een manier om verkeerd geencodeerde data te herstellen?

Verlanglijstje: Switch 2, PS5 Pro Most wanted: Switch 2


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Deddiekoel schreef op donderdag 04 december 2008 @ 16:51:
[...]

Ik snap het wel en ook het verschil. Even voor de duidelijkheid om de bytes uit lezen moet je weten welke codepage je moet gebruiken om de juiste representatie te vinden. Een String in Java is altijd UTF-16 en dus worden de bytes geconverteerd naar UTF-16. Als je gaat wegschrijven naar bytes moet je dus weer de juiste encodering meegeven.

Maar helaas was ik te snel met het roepen dat het werkte want dat doet het nog steeds niet. Het TibrvMsg object wordt wel gemaakt maar de inhoud wordt verderop niet geaccepteerd...

Waarschijnlijk komt dit echter omdat de input msg ook al verkeerd is. De bron is codepage cp1025 maar komt binnen als cp1252. Ik denk dat de String conversie daarop stuk loopt.

Is er uberhaubt een manier om verkeerd geencodeerde data te herstellen?
Ja als je zeker weet dat je data 1252 encoded is kun je natuurlijk gewoon die codepage gebruiken om een string te construeren. Of je gaat naar de bron van het probleem en je zorgt dat de juiste codepage gecommuniceerd word.

Maar dit soort dingen kun je natuurlijk makkelijk controleren door te debuggen!

Als je bijvoorbeeld het volgende doet zul je in je debugger als verschil moeten zien
Java:
1
2
byte[] bytes = myString.getBytes( verkeerdeEncoding );
myString = new String( bytes, verkeerdeEncoding );

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1