2013-11-25 2 views
1

문자 배열을 바이트 배열로 변환하는 몇 가지 코드가 있습니다 (중간 문자열을 만들지 않고 요구 사항입니다). 끝에 여분의 바이트. 다음은 문제를 설명하는 테스트 코드입니다.Java - 문자 배열을 바이트 배열로 변환 - 길이가 일치하지 않습니다.

String s = "TomJSawyer"; 

System.out.println("Original String length = " + s.length()); 

char[] caOrig = s.toCharArray(); 

System.out.println("Original Char Array Length = " + caOrig.length); 

byte[] ba1 = Charset.forName("UTF-8").encode(CharBuffer.wrap(caOrig)).array(); 

System.out.println("byte array converted from char array length = " + ba1.length); 

byte[] ba2 = s.toString().getBytes("UTF-8"); 

System.out.println("byte array converted from String length = " + ba2.length); 

그리고 여기에는 Winodows의 jdk160_24에서 실행되는 출력이 나와 있습니다.

Original String length = 10 
Original Char Array Length = 10 
byte array converted from char array length = 11 
byte array converted from String length = 10 

Charset을 사용하여 char 배열에서 변환 한 결과 인 추가 바이트는 0입니다. 입력 문자열이 길어지면 바이트 배열 끝에 추가 된 0 바이트 수가 증가합니다. 이것이 인코딩과 관련이 있다고 생각하지만 UTF-8을 두 곳으로 지정했기 때문에 왜 그렇게 될지 모릅니다.

누구든지 내게 어떤 일이 일어나고 있는지 또는 올바른 방향으로 나를 가리키면 정말 고맙겠습니다. 미리 감사드립니다. 당신이 char[]을 사용하지 않는 경우

답변

0

, 당신은 StringBuffer 사용할 수 있습니다

StringBuffer sb = "TomJSawyer"; 

String.valueOf(sb).getBytes(); 
+0

StringBuffer sb = "TomJSawyer"; – MoMan

+2

감사합니다. 불행히도 String.valueOf()는 내가 피하려고하는 중간 문자열을 생성합니다. – user2801442

5

documentation for CharsetEncoder.encode는 말한다 :

결과 : 결과를 포함하는 새로 할당 된 바이트 버퍼 인코딩 작업의 버퍼의 위치는 제로가되어, 그 마지막 바이트는 마지막에 기입해진 바이트의 뒤에 계속됩니다.

ByteBuffer의 전체 백업 배열이 유효한 데이터라고 잘못 가정했습니다. ByteBuffer의 limit까지의 바이트 만보고 있어야합니다. 사실, CharsetEncoder.encode 메서드는 반환 된 ByteBuffer가 배열에 의해 뒷받침되는 것을 보장하지 않으므로 array()을 호출하면 안됩니다.

의 ByteBuffer 될 것이라고 판독 안정적인 방법 :

ByteBuffer buffer = Charset.forName("UTF-8").encode(CharBuffer.wrap(caOrig)); 
byte[] ba1 = new byte[buffer.limit()]; 
buffer.get(ba1); 
+0

감사합니다. VGR. 그게 답입니다. 정말 감사. – user2801442

+0

본 사이트를 처음 접했습니다. 이 질문에 답할 수있는 방법이 있습니까? – user2801442

+0

http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work에서 : "답변을 승인 된 것으로 표시하려면 답변 옆에있는 체크 표시를 클릭하여 빈에서 녹색 (아래 스크린 샷 참조) " – VGR

0

문자 배열의 크기는 많은 시나리오에서 바이트 배열의 크기와 다르다. char 배열에서 중국어 또는 일본어 문자를 사용할 때 동일하지 않습니다. 방금이 문제와 관련된 앱에서 버그를 수정했습니다.

다음
public static void main(String[] args) throws Exception { 
    char[] chars = new char[] { '中', '国' }; 
    System.out.println("string content: " + new String(chars)); 
    System.out.println("char array size: " + chars.length); 
    byte[] bytes = new String(chars).getBytes("UTF-8"); 
    System.out.println("byte array size: " + bytes.length); 
    System.out.println("converted string content: " + new String(bytes, "UTF-8")); 
} 

콘솔의 출력입니다 : 내가 만든으로

string content: 中国 
char array size: 2 
byte array size: 6 
converted string content: 中国 

다시 같은 실수를하지 마십시오 여기

는 한자를 사용하여 테스트 조각입니다.

관련 문제