ใน Java ถ้าฉันมีสตริงx
ฉันจะคำนวณจำนวนไบต์ในสตริงนั้นได้อย่างไร
ใน Java ถ้าฉันมีสตริง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 "????")
(โปรดทราบว่าหากคุณไม่ได้ระบุอาร์กิวเมนต์ชุดอักขระจะใช้ชุดอักขระเริ่มต้นของแพลตฟอร์มซึ่งอาจมีประโยชน์ในบางบริบท แต่โดยทั่วไปคุณควรหลีกเลี่ยงขึ้นอยู่กับค่าเริ่มต้นและใช้ชุดอักขระที่ชัดเจนเสมอเมื่อเข้ารหัส / ต้องการการถอดรหัส)
getBytes()
มันจะใช้การเข้ารหัสตัวอักษรเริ่มต้นของระบบของคุณ
หากคุณใช้การอ้างอิงแบบ 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
บน VM 32 บิตหรือ VM 64 บิตพร้อม OOP ที่บีบอัด (-XX: + UseCompressedOops) การอ้างอิงมีขนาด 4 ไบต์ ดังนั้นทั้งหมดจะเป็น:
sizeof(string) = 32 + string.length() * 2
สิ่งนี้ไม่ได้คำนึงถึงการอ้างอิงถึงวัตถุสตริง
sizeof
ควรจะมีหลาย 8.
คำตอบที่หยาบคาย (แม้ว่าไม่จำเป็นต้องเป็นคำที่มีประโยชน์มากที่สุดขึ้นอยู่กับสิ่งที่คุณต้องการจะทำกับผลลัพธ์) คือ:
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 ไบต์ให้กับความยาวของอาร์เรย์
ตามวิธีการแปลงสตริงไปยังและจากอาร์เรย์ UTF8 ไบต์ใน Java :
String s = "some text here";
byte[] b = s.getBytes("UTF-8");
System.out.println(b.length);
s.getBytes(Charset.forName("UTF-8"))
ลอง:
String
เช่นจัดสรรเงินจำนวนหนึ่งของไบต์ในหน่วยความจำ บางทีคุณกำลังมองหาบางอย่างsizeof("Hello World")
ที่จะส่งกลับจำนวนไบต์ที่จัดสรรโดยโครงสร้างข้อมูลเอง?
ใน Java ไม่จำเป็นต้องมีsizeof
ฟังก์ชั่นเพราะเราไม่เคยจัดสรรหน่วยความจำเพื่อจัดเก็บโครงสร้างข้อมูล เราสามารถมีลักษณะที่เป็นString.java
ไฟล์สำหรับการประเมินคร่าวๆและเราเห็นบางส่วน 'int' char[]
อ้างอิงบางและ ข้อกำหนดภาษา Javaที่กำหนดว่าchar
ช่วง 0-65535 ดังนั้นไบต์ที่สองมีเพียงพอที่จะเก็บถ่านเดียวในหน่วยความจำ แต่ JVM ไม่จำเป็นต้องเก็บถ่านหนึ่งตัวใน 2 ไบต์ แต่จะต้องรับประกันว่าการใช้งานchar
สามารถเก็บค่าของช่วงที่กำหนดได้
ดังนั้นsizeof
จริงๆไม่ได้ทำให้รู้สึกใด ๆ ใน Java แต่สมมติว่าเรามีสตริงขนาดใหญ่และหนึ่งchar
จัดสรรสองไบต์แล้ว footprint หน่วยความจำของString
วัตถุอย่างน้อย2 * str.length()
ไบต์
มีวิธีการที่เรียกว่าเป็นgetBytes () ใช้มันอย่างชาญฉลาด
ลองสิ่งนี้:
Bytes.toBytes(x).length
สมมติว่าคุณประกาศและเริ่มต้น x ก่อน
Bytes
ชั้นเรียนไม่พบ
เพื่อหลีกเลี่ยงการลองใช้:
String s = "some text here";
byte[] b = s.getBytes(StandardCharsets.UTF_8);
System.out.println(b.length);