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


538

Java String를 byte[]( 상자가 아닌) 로 변환하는 방법이 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.