В java, если у меня есть строка x Как я могу вычислить количество байтов в этой строке?байтов строки в java?
ответ
По How to convert Strings to and from UTF8 byte arrays in Java:
String s = "some text here";
byte[] b = s.getBytes("UTF-8");
System.out.println(b.length);
но извините меня, когда я скомпилирую ваш код, он дает мне ошибку; из-за параметра «UTF-8». где, когда я передаю пустой параметр, он дает мне такую же длину, как x.length. я неправильно понимаю концепцию. помогите пожалуйста – Green 2010-12-08 09:19:29
Там есть метод, называемый getBytes(). Использовать его мудро .
Строка представляет собой список символов (то есть кодовые точки). Количество байтов, принятых для представления строки , полностью зависит от того, какую кодировку вы используете, чтобы превратить ее в байты.
Тем не менее, вы можете превратить строку в массив байтов, а затем посмотреть на его размер следующим образом:
// 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 "????")
(Обратите внимание, что если вы не обеспечивают набор символов аргумента , по умолчанию персонаж платформы установлен используется. Это может быть полезно в некоторых случаях, но в целом следует избегать в зависимости от значения по умолчанию, и всегда использовать явный набор символов, когда требуется кодирование/декодирование.)
Попробуйте это :
Bytes.toBytes(x).length
Предполагая, что вы объявили и инициализировали x до
A String
экземпляр выделяет определенное количество байтов в памяти. Может быть, вы смотрите на что-то вроде sizeof("Hello World")
, которое вернет количество байтов, выделяемых самой структурой данных?
В Java, как правило, нет необходимости в функции sizeof
, потому что мы никогда не выделяем память для хранения структуры данных. Мы можем посмотреть файл String.java
для приблизительной оценки, и мы увидим некоторые «int», некоторые ссылки и char[]
. Java language specification определяет, что char
варьируется от 0 до 65535, поэтому для сохранения одного символа в памяти достаточно двух байтов. Но JVM не должен хранить один символ в 2 байтах, он должен только гарантировать, что реализация char
может содержать значения заданного диапазона.
Так что sizeof
действительно не имеет никакого смысла в Java. Но, предполагая, что у нас есть большая строка, а одна char
выделяет два байта, тогда размер памяти объекта String
составляет не менее 2 * str.length()
в байтах.
педантичный ответ (хотя и не обязательно является наиболее полезным, в зависимости от того, что вы хотите сделать с результатом) является:
string.length() * 2
Java строки физически хранятся в UTF-16BE
кодирования, который использует 2 байта на код блока и String.length()
измеряет длину в UTF-16 кодовых блоков, так что это эквивалентно:
final byte[] utf16Bytes= string.getBytes("UTF-16BE");
System.out.println(utf16Bytes.length);
и это покажет вам размер внутреннего char
массива, в байт.
Примечание: "UTF-16"
даст другой результат от "UTF-16BE"
, поскольку прежняя кодировка введет BOM, добавив 2 байта к длине массива.
Если вы работаете с 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
На 32-битной виртуальной машине или 64-разрядную виртуальной машину со сжатым упсом (- XX: + UseCompressedOops), ссылки - 4 байта. Таким образом, общая сумма будет равна:
sizeof(string) = 32 + string.length() * 2
Это не учитывает ссылки на строковый объект.
- 1. Запись строки в массив байтов в java
- 2. Преобразование строки в массив байтов (0x) - Java
- 3. Использование строки вместо массива байтов java
- 4. Объединение байтов в строки
- 5. Порядок байтов: преобразование java-байтов в C#
- 6. Java: convert Список байтов в массив байтов
- 7. Объединение байтов в java
- 8. Установить значения байтов в java
- 9. Java преобразования байтов (в виде строки) в строку
- 10. Преобразование строки в массив байтов
- 11. Преобразование строки байтов в ASCII
- 12. Последовательность байтов командной строки
- 13. Преобразование строки Java в 16-байтовый массив байтов
- 14. Отправка строки java в качестве байтов c/C++
- 15. Извлечение байтов строки возвращает разные результаты в ObjC, чем Java
- 16. Append байтов в строку в Java
- 17. преобразовать массив строки в массив байтов
- 18. Сравнение эффективности использования пространства байтов/байтов Java
- 19. Назначение в массив байтов в Java
- 20. Заполнение массива байтов в Java
- 21. Как массивы байтов в Java?
- 22. Хэш массива байтов в Java
- 23. Запись байтов в java-сокет
- 24. Улучшение преобразования байтов в Java
- 25. Пакет Обобщение байтов в java
- 26. Преобразование строки байтов в соответствующее значение ASCII
- 27. Преобразование массива байтов PNG в массив байтов JPEG в java
- 28. Понимание байтов Java
- 29. Java - строка байтов, байт []
- 30. Java - Modulo Добавление байтов
Возможно, вы захотите использовать String для представления тела ответа HTTP и использовать размер для установки заголовка Content-Length, который указан в октетах/байтах, а не в символах. http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.13 – iX3 2012-12-18 20:58:46
В столбце базы данных может быть ограничение длины в байтах, например. VARCHAR2 (4000 BYTE) в Oracle. Возможно, вам захочется узнать количество байтов строки в желаемой кодировке, чтобы узнать, подходит ли строка. – Somu 2013-06-04 06:09:38
@ iX3 Точно так же, как я пытался это сделать. – 2013-06-28 10:47:54