Vra

Ek het binêre data in'n lêer wat ek kan lees in'n byte array en die proses is met geen probleem nie.Nou ek nodig het om te stuur dele van die data oor'n netwerk konneksie as elemente in'n XML-dokument.My probleem is dat wanneer ek skakel die data van'n verskeidenheid van grepe om'n String en terug te'n skikking van grepe, die data is om beskadig.Ek getoets het hierdie op een masjien te isoleer die probleem aan die String sukses, so ek weet nou dat dit nie om beskadig deur die XML parser of die netwerk vervoer.

Wat ek het is nou

byte[] buffer = ...; // read from file
// a few lines that prove I can process the data successfully
String element = new String(buffer);
byte[] newBuffer = element.getBytes();
// a few lines that try to process newBuffer and fail because it is not the same data anymore

Is daar iemand wat weet hoe om te skakel binêre om te String en terug sonder die verlies van data?

Antwoord:Danksy Sam.Ek voel soos'n idioot.Ek het hierdie gister geantwoord, want my SAX parser kla.Vir een of ander rede, wanneer ek het in hierdie skynbaar aparte kwessie, dit het nie gebeur nie vir my dat dit was'n nuwe simptoom van die dieselfde probleem.

EDIT:Net vir die wille van volledigheid, ek gebruik die Base64 klas van die Apache Commons Codec pakket hierdie probleem op te los.

Was dit nuttig?

Oplossing

As jy enkodeer dit in base64, dit sal op sy beurt enige data in ascii veilige teks, maar base64 geïnkripteer data is groter as die original data

Ander wenke

String (byte []) behandel die data as die verstek karakter enkodering. So, hoe grepe kry omgeskakel vanaf 8-bit waardes tot 16-bit Java Unicode karakters sal nie net verskil tussen bedryfstelsels, maar kan selfs wissel tussen verskillende gebruikers met behulp van verskillende codepages op dieselfde masjien! Dit konstruktor is net goed vir dekodering een van jou eie teks lêers. Moenie probeer om arbitrêre grepe skakel na karakters in Java!

Encoding as base64 is 'n goeie oplossing. Dit is hoe lêers gestuur word oor SMTP (e-pos). Die (gratis) Apache Commons Kodek projek sal die werk te doen.

byte[] bytes = loadFile(file);          
//all chars in encoded are guaranteed to be 7-bit ASCII
byte[] encoded = Base64.encodeBase64(bytes);
String printMe = new String(encoded, "US-ASCII");
System.out.println(printMe);
byte[] decoded = Base64.decodeBase64(encoded);

As alternatief kan jy gebruik maak van die Java 6 DatatypeConverter :

import java.io.*;
import java.nio.channels.*;
import javax.xml.bind.DatatypeConverter;

public class EncodeDecode {    
  public static void main(String[] args) throws Exception {
    File file = new File("/bin/ls");
    byte[] bytes = loadFile(file, new ByteArrayOutputStream()).toByteArray();
    String encoded = DatatypeConverter.printBase64Binary(bytes);
    System.out.println(encoded);
    byte[] decoded = DatatypeConverter.parseBase64Binary(encoded);
    // check
    for (int i = 0; i < bytes.length; i++) {
      assert bytes[i] == decoded[i];
    }
  }

  private static <T extends OutputStream> T loadFile(File file, T out)
                                                       throws IOException {
    FileChannel in = new FileInputStream(file).getChannel();
    try {
      assert in.size() == in.transferTo(0, in.size(), Channels.newChannel(out));
      return out;
    } finally {
      in.close();
    }
  }
}

Sien hierdie vraag, Hoe kan jy binêre data in te sluit in XML? In plaas van die omskakeling van die byte [] in String dan stoot in XML iewers, sit die byte [] om 'n String via base64 (sommige XML biblioteke het 'n tipe om dit te doen vir jou). Die BASE64 dekodeer sodra jy die String terug van XML.

Gebruik http://commons.apache.org/codec/

Jy data kan kry deurmekaar as gevolg van allerlei vreemde karakter stel beperkings en die teenwoordigheid van nie-priting karakters. Vashou w / BASE64.

Hoe word jy die bou van jou XML dokument? As jy gebruik java se gebou in XML klasse dan die string enkodering hanteer moet word vir jou.

Neem 'n blik op die javax.xml en org.xml pakkette. Dit is wat ons gebruik vir die opwekking van XML dokumente, en dit hanteer al die string enkodering en dekodering baie mooi.

--- EDIT:

Hmm, ek dink ek die probleem verstaan. Jy is nie probeer om 'n gereelde string, maar sommige stel arbitrêre binêre data enkodeer? In so 'n geval die base64 in 'n vroeëre opmerking voorgestel is waarskynlik die pad om te gaan. Ek glo dit is 'n redelik standaard manier van kodering binêre data in XML.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top