Java String을 byte []로 변환하는 방법?


538

Java Stringbyte[]( 상자가 아닌) 로 변환하는 방법이 Byte[]있습니까?

이것을 시도하면서 :

System.out.println(response.split("\r\n\r\n")[1]);
System.out.println("******");
System.out.println(response.split("\r\n\r\n")[1].getBytes().toString());

그리고 별도의 출력을 얻고 있습니다. gzip 문자열이므로 첫 번째 출력을 표시 할 수 없습니다.

<A Gzip String>
******
[B@38ee9f13

두 번째는 주소입니다. 내가 잘못하고있는 것이 있습니까? byte[]gzip 압축 풀기 프로그램에 피드하려면 다음과 같은 결과가 필요합니다 .

String decompressGZIP(byte[] gzip) throws IOException {
    java.util.zip.Inflater inf = new java.util.zip.Inflater();
    java.io.ByteArrayInputStream bytein = new java.io.ByteArrayInputStream(gzip);
    java.util.zip.GZIPInputStream gzin = new java.util.zip.GZIPInputStream(bytein);
    java.io.ByteArrayOutputStream byteout = new java.io.ByteArrayOutputStream();
    int res = 0;
    byte buf[] = new byte[1024];
    while (res >= 0) {
        res = gzin.read(buf, 0, buf.length);
        if (res > 0) {
            byteout.write(buf, 0, res);
        }
    }
    byte uncompressed[] = byteout.toByteArray();
    return (uncompressed.toString());
}


죄송합니다, String을 bytearray로 변환하고 잘못된 결과를 얻으려고합니다. 잠시 후 다시 편집하겠습니다.
Mkl Rjv

8
문제는 String.getBytes()실제로 바이트 배열을 반환하지만 toString()바이트 배열이 유용한 결과를 반환 한다는 믿음 은 올바르지 않습니다.
Louis Wasserman

답변:


948

방법에 decompressGZIP()필요한 객체 는 byte[]입니다.

따라서 귀하가 요청한 질문에 대한 기본적인 기술적 답변은 다음과 같습니다.

byte[] b = string.getBytes();
byte[] b = string.getBytes(Charset.forName("UTF-8"));
byte[] b = string.getBytes(StandardCharsets.UTF_8); // Java 7+ only

그러나 당신이 씨름하는 것처럼 보이는 문제는 이것이 잘 표시되지 않는다는 것입니다. 호출 toString()하면 Object.toString()클래스 이름 + 메모리 주소 인 기본값 이 제공됩니다 . 하여 결과적으로 [B@38ee9f13상기 [B수단 byte[]38ee9f13의해 분리 된 메모리 어드레스이다 @.

표시 목적으로 다음을 사용할 수 있습니다.

Arrays.toString(bytes);

그러나 이것은 쉼표로 구분 된 정수 시퀀스로 표시되며 원하는 정수 일 수도 아닐 수도 있습니다.

String에서 다시 읽을 수있게하려면 byte[]다음을 사용하십시오.

String string = new String(byte[] bytes, Charset charset);

Charset버전이 선호 되는 이유는 StringJava의 모든 객체가 내부적으로 UTF-16으로 저장되기 때문입니다. 로 변환 하면 선택한 문자 세트에 따라 byte[]해당 글리프의 다른 글리프 바이트가 표시 String됩니다.


26
string.getBytes ( "UTF-8")은 UnsupportedEncodingException을 처리해야하지만 string.getBytes (Charset.forName ( "UTF-8"))는 처리하지 않습니다. 어떤 방법이 더 낫다고 주장하면서 나는 독자들을위한 연습으로 떠난다.
Michael Warner

20
string.getBytes(StandardCharsets.UTF_8)또한 사용될 수 있으며, 다음과 동일합니다string.getBytes(Charset.forName("UTF-8"))
Bahadır Yağan

3
내가 믿는이 StandardCharsets자바 7의 새로운 점
스튜어트

2
이 답변이 왜 그렇게 많은지지를 받았는지 이해할 수 없습니다. 그것은 옳을 수도 있지만 매우 도움이되지는 않습니다 ... OP 코드가 이미 가지고있는 몇 줄의 코드 만 있고 차이점 Charset.forName("UTF-8")이 무엇이고 왜 중요한지 설명하지 않습니다 .
LarsH

3
@LarsH 당신은 좋은 지적을합니다. 솔직히 말해서, 나는이 대답이 그렇게 인기를 끌기를 기대하지 않았습니다. 나는 upvotes를 "적당하게"하기 위해 답을 확장했다. 잘만되면 그것은 개선이다.
Stewart


14

String.getBytes ()를 사용해보십시오. 문자열 데이터를 나타내는 byte []를 반환합니다. 예:

String data = "sample data";
byte[] byteData = data.getBytes();

14

간단히:

String abc="abcdefghight";

byte[] b = abc.getBytes();

어떤 경우는 abc같은 US-ASCII 이외의 문자가 포함되어 있습니다 "greater than 2³² − 1"( "AB2"같은)하거나 바이너리 데이터를?
U. Windl

문자열은 5 자만 사용하는 것처럼 작동하지 않습니다 . 그러나 내가 사용할 때 나는 getBytes()7자를 얻었다.
Teocci

11

배열 String.getBytes()을 반환하는 것을 사용할 수 있습니다 byte[].


7

시도하고 싶을 수도 있습니다 return new String(byteout.toByteArray(Charset.forName("UTF-8")))


1
바이트에서 문자열로 다른 방법을 보여 주셔서 감사합니다.
Trismegistos

1

java를 String 매개 변수로 변경할 필요는 없습니다. 포인터와 코드가없는 String을 수신하려면 c 코드를 변경해야합니다.

Bool DmgrGetVersion (String szVersion);

Char NewszVersion [200];
Strcpy (NewszVersion, szVersion.t_str ());
.t_str () applies to builder c ++ 2010

1

나는 파티에 조금 늦었다는 것을 알고 있지만 이것은 꽤 깔끔합니다 (우리의 교수가 우리에게주었습니다)

public static byte[] asBytes (String s) {                   
           String tmp;
           byte[] b = new byte[s.length() / 2];
           int i;
           for (i = 0; i < s.length() / 2; i++) {
             tmp = s.substring(i * 2, i * 2 + 2);
             b[i] = (byte)(Integer.parseInt(tmp, 16) & 0xff);
           }
           return b;                                            //return bytes
    }

1
16 진수로 인코딩 된 바이트 배열을 디코딩합니다. 이 질문과 다른 점이 있습니다.
Palec
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.