[java] 자바에서 문자열의 바이트

Java에서 String이 있으면 x해당 문자열의 바이트 수를 어떻게 계산할 수 있습니까?



답변

문자열은 문자 목록입니다 (예 : 코드 포인트). 문자열을 나타내는 데 사용되는 바이트 수는 문자열 을 바이트로 변환하는 데 사용하는 인코딩에 전적으로 달려 있습니다 .

즉, 문자열을 바이트 배열로 바꾸고 다음과 같이 크기를 볼 수 있습니다.

// The input string for this test
final String string = "Hello World";

// Check length, in characters
System.out.println(string.length()); // prints "11"

// Check encoded sizes
final byte[] utf8Bytes = string.getBytes("UTF-8");
System.out.println(utf8Bytes.length); // prints "11"

final byte[] utf16Bytes= string.getBytes("UTF-16");
System.out.println(utf16Bytes.length); // prints "24"

final byte[] utf32Bytes = string.getBytes("UTF-32");
System.out.println(utf32Bytes.length); // prints "44"

final byte[] isoBytes = string.getBytes("ISO-8859-1");
System.out.println(isoBytes.length); // prints "11"

final byte[] winBytes = string.getBytes("CP1252");
System.out.println(winBytes.length); // prints "11"

따라서 간단한 “ASCII”문자열조차 사용되는 인코딩에 따라 표현에 다른 바이트 수를 가질 수 있습니다. 귀하의 사례에 관심있는 문자 세트를에 대한 인수로 사용하십시오 getBytes(). UTF-8이 모든 문자를 단일 바이트로 표현한다고 가정하는 함정에 빠지지 마십시오 .

final String interesting = "\uF93D\uF936\uF949\uF942"; // Chinese ideograms

// Check length, in characters
System.out.println(interesting.length()); // prints "4"

// Check encoded sizes
final byte[] utf8Bytes = interesting.getBytes("UTF-8");
System.out.println(utf8Bytes.length); // prints "12"

final byte[] utf16Bytes= interesting.getBytes("UTF-16");
System.out.println(utf16Bytes.length); // prints "10"

final byte[] utf32Bytes = interesting.getBytes("UTF-32");
System.out.println(utf32Bytes.length); // prints "16"

final byte[] isoBytes = interesting.getBytes("ISO-8859-1");
System.out.println(isoBytes.length); // prints "4" (probably encoded "????")

final byte[] winBytes = interesting.getBytes("CP1252");
System.out.println(winBytes.length); // prints "4" (probably encoded "????")

(문자 집합 인수를 제공하지 않으면 플랫폼의 기본 문자 집합 이 사용됩니다. 일부 상황에서는 유용 할 수 있지만 일반적으로 기본값에 의존하지 말고 인코딩 / 디코딩이 필요합니다.)


답변

64 비트 참조로 실행중인 경우 :

sizeof(string) =
8 + // object header used by the VM
8 + // 64-bit reference to char array (value)
8 + string.length() * 2 + // character array itself (object header + 16-bit chars)
4 + // offset integer
4 + // count integer
4 + // cached hash code

다시 말해:

sizeof(string) = 36 + string.length() * 2

압축 된 OOP (-XX : + UseCompressedOops)가있는 32 비트 VM 또는 64 비트 VM에서 참조는 4 바이트입니다. 따라서 총계는 다음과 같습니다.

sizeof(string) = 32 + string.length() * 2

문자열 객체에 대한 참조는 고려하지 않습니다.


답변

pedantic 답변 (결과로 무엇을 하려는지에 따라 가장 유용한 것은 아니지만)는 다음과 같습니다.

string.length() * 2

Java 문자열은 UTF-16BE코드 단위로 2 바이트를 사용하는 인코딩에 실제로 저장되며 String.length()UTF-16 코드 단위로 길이를 측정하므로 다음과 같습니다.

final byte[] utf16Bytes= string.getBytes("UTF-16BE");
System.out.println(utf16Bytes.length);

그리고 이것은 내부 char배열 의 크기를 바이트 단위로 알려줍니다 .

참고 : 이전 인코딩이 배열 길이에 2 바이트를 추가 하여 BOM 을 삽입 할 때와 "UTF-16"다른 결과가 제공 됩니다."UTF-16BE"


답변

Java에서 문자열을 UTF8 바이트 배열로 변환하는 방법에 따르면 :

String s = "some text here";
byte[] b = s.getBytes("UTF-8");
System.out.println(b.length);


답변

String인스턴스 메모리 바이트의 특정 량을 할당한다. 아마도 sizeof("Hello World")데이터 구조 자체에 의해 할당 된 바이트 수를 반환하는 것을 찾고 있습니까?

Java에서는 sizeof데이터 구조를 저장하기 위해 메모리를 할당하지 않으므로 일반적으로 함수 가 필요 하지 않습니다. String.java대략적인 추정을 위해 파일을 살펴볼 수 있으며 ‘int’, 일부 참조 및 a를 볼 수 char[]있습니다. Java 언어 사양 을 정의는 것으로 char0 ~ 65535 범위는, 그래서 2 바이트 메모리에 하나의 문자를 유지하기에 충분합니다. 그러나 JVM은 하나의 문자를 2 바이트로 저장할 필요가 없으며, 구현시 char정의 범위의 값을 보유 할 수 있음을 보장해야합니다 .

따라서 sizeof실제로 Java에서는 의미가 없습니다. 그러나 우리가 큰 문자열과 하나를 가지고 있다고 가정하면char 2 바이트를 할당String 객체 의 메모리 공간은 적어도 2 * str.length()바이트입니다.


답변

getBytes () 라는 메소드가 있습니다 . 현명하게 사용하십시오.


답변

이 시도 :

Bytes.toBytes(x).length

x를 선언하고 초기화했다고 가정