바이너리 데이터를 문자열로 변환하고 Java에서 다시 변환하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/20778

  •  09-06-2019
  •  | 
  •  

문제

파일에 바이트 배열로 읽어서 문제 없이 처리할 수 있는 이진 데이터가 있습니다.이제 네트워크 연결을 통해 데이터의 일부를 XML 문서의 요소로 보내야 합니다.내 문제는 데이터를 바이트 배열에서 문자열로 변환하고 다시 바이트 배열로 변환할 때 데이터가 손상된다는 것입니다.문자열 변환에 대한 문제를 분리하기 위해 한 컴퓨터에서 이것을 테스트했으므로 이제 XML 파서나 네트워크 전송에 의해 손상되지 않는다는 것을 알 수 있습니다.

지금 내가 갖고 있는 것은

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

데이터 손실 없이 바이너리를 문자열로 변환하고 그 반대로 변환하는 방법을 아는 사람이 있습니까?

답변됨:고마워요 샘.나는 바보처럼 느껴진다.내 SAX 파서가 불평했기 때문에 어제 이에 대한 답변을 받았습니다.어떤 이유에서인지 별개로 보이는 이 문제에 직면했을 때 그것이 동일한 문제의 새로운 증상이라는 생각이 들지 않았습니다.

편집하다:완전성을 위해 다음을 사용했습니다. Base64 의 수업 아파치 커먼즈 코덱 이 문제를 해결하기 위한 패키지입니다.

도움이 되었습니까?

해결책

base64로 인코딩하면 모든 데이터가 ASCII 안전 텍스트로 변환되지만, base64로 인코딩된 데이터는 원본 데이터보다 큽니다.

다른 팁

문자열(바이트[]) 데이터를 기본 문자 인코딩으로 처리합니다.따라서 바이트가 8비트 값에서 16비트 Java 유니코드 문자로 변환되는 방법은 운영 체제마다 다를 뿐만 아니라 동일한 시스템에서 다른 코드 페이지를 사용하는 사용자마다 다를 수도 있습니다!이 생성자는 자신의 텍스트 파일 중 하나를 디코딩하는 데에만 적합합니다.Java에서 임의의 바이트를 문자로 변환하려고 시도하지 마십시오!

다음으로 인코딩 베이스64 좋은 해결책입니다.이것이 SMTP(이메일)를 통해 파일이 전송되는 방식입니다.(무료) 아파치 공용 코덱 프로젝트가 그 일을 할 것입니다.

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);

또는 Java 6을 사용할 수 있습니다. 데이터 유형 변환기:

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();
    }
  }
}

이 질문을 참조하세요. XML에 이진 데이터를 어떻게 포함합니까?byte[]를 문자열로 변환한 다음 어딘가에 XML로 푸시하는 대신 BASE64 인코딩을 통해 byte[]를 문자열로 변환하십시오(일부 XML 라이브러리에는 이를 수행하는 유형이 있습니다).XML에서 문자열을 다시 가져오면 BASE64 디코드가 수행됩니다.

사용 http://commons.apache.org/codec/

온갖 종류의 이상한 문자 집합 제한과 인쇄할 수 없는 문자의 존재로 인해 데이터가 엉망이 될 수 있습니다.BASE64를 사용하여 스틱.

XML 문서를 어떻게 작성하고 있나요?Java의 내장 XML 클래스를 사용하는 경우 문자열 인코딩이 자동으로 처리되어야 합니다.

javax.xml 및 org.xml 패키지를 살펴보세요.이것이 우리가 XML 문서를 생성하는 데 사용하는 것이며 모든 문자열 인코딩 및 디코딩을 매우 훌륭하게 처리합니다.

---편집하다:

흠, 제가 문제를 잘못 이해한 것 같습니다.일반 문자열이 아닌 임의의 이진 데이터 세트를 인코딩하려고 하시나요?이 경우 이전 의견에서 제안한 Base64 인코딩이 아마도 갈 길일 것입니다.나는 이것이 XML로 바이너리 데이터를 인코딩하는 상당히 표준적인 방법이라고 믿습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top