تسمى عملية تحويل مصفوفة البايت إلى سلسلة فك التشفير. تتطلب هذه العملية مجموعة محارف. على الرغم من ذلك، يجب علينا استخدام محارف ل فك التشفير مصفوفة بايت.
هناك طريقتان لتحويل مجموعة البايت إلى سلسلة:
- باستخدام منشئ فئة السلسلة
- باستخدام ترميز UTF-8
باستخدام منشئ فئة السلسلة
إن أبسط طريقة لتحويل مصفوفة بايت إلى سلسلة هي استخدام مُنشئ فئة السلسلة مع byte[] كوسيطة مُنشئة.
String str=new String(bytes);
مثال
لا يستخدم المثال التالي أي ترميز للأحرف.
public class ByteArraytoStringExample { public static void main(String args[]) { try { byte[] bytes = 'hello world'.getBytes(); //creates a string from the byte array without specifying character encoding String s = new String(bytes); System.out.println(s); } catch(Exception e) { e.printStackTrace(); } } }
انتاج:
باستخدام ترميز UTF-8
تذكر ترميز الأحرف أثناء تحويل مصفوفة البايت إلى سلسلة. نظرًا لأن البايتات هي البيانات الثنائية بينما السلسلة هي بيانات الأحرف. من المهم معرفة الترميز الأصلي للنص الذي تم إنشاء مصفوفة البايت منه. عندما نستخدم ترميزًا مختلفًا للأحرف، فإننا لا نستعيد السلسلة الأصلية.
لنفترض أنه يتعين علينا قراءة مصفوفة بايت من ملف مشفر في ' ISO_8859_1 '. ليس لدينا أي ترميز للأحرف أثناء تحويل مجموعة البايت إلى سلسلة. نقوم بتحويل مصفوفة البايت إلى سلسلة باستخدام مُنشئ فئة السلسلة، لكنه لا يوفر ضمانًا بأننا سنحصل على نفس النص مرة أخرى. وذلك لأن مُنشئ فئة String يستخدم الترميز الافتراضي للنظام الأساسي.
تحتوي وحدات البايت على 8 بتات والتي يمكن أن تحتوي على ما يصل إلى 256 قيمة مميزة. إنه يعمل مع مجموعة أحرف ASCII، حيث يتم استخدام سبع بتات فقط. إذا كانت مجموعات الأحرف تحتوي على أكثر من 256 قيمة، فيجب أن نحدد بوضوح التشفير الذي يخبرنا بكيفية تشفير الأحرف في تسلسل من البايتات.
هناك مجموعات الأحرف التالية التي تدعمها منصة Java هي:
- StandardCharsets.ISO_8859_1
- StandardCharsets.US_ASCII
- StandardCharsets.UTF_16
- StandardCharsets.UTF_16BE
- StandardCharsets.UTF_16LE
عندما لا نتذكر التشفير الدقيق، في مثل هذه الحالات، لا يتمكن نظامنا الأساسي من تحويل تلك الأحرف الخاصة بشكل صحيح. يتم حل هذه المشكلة عن طريق توفير ' ترميز UTF-8 'كترميز للأحرف. توفر Java مُنشئًا آخر مثقلًا في فئة String والذي يقبل ترميز الأحرف.
new String(byte[], 'character encoding');
مثال
في المثال التالي استخدمنا StandardCharset.UTF_8 لتحديد الترميز.
import java.io.IOException; import java.nio.charset.StandardCharsets; public class ByteArraytoStringExample1 { public static void main(String[] args) { try { byte[] b = 'Morning'.getBytes(StandardCharsets.UTF_8); //byte array String string = new String(b, StandardCharsets.UTF_8); //string with 'UTF-8' encoding System.out.println(string); } catch(Exception e) { e.printStackTrace(); } } }
انتاج:
مثال
في المثال التالي، قمنا بأخذ char أثناء إنشاء مصفوفة البايت. إنه يعمل بسبب التشغيل التلقائي. يتم تحويل الحرف 'T' إلى 84 في مصفوفة البايت وهكذا. ولهذا السبب فإن إخراج صفيفتي البايت هو نفسه.
public class ByteArraytoStringExample2 { public static void main(String[] args) { byte[] byteArray = { 'T', 'E', 'C', 'H', 'N', 'O','L','O','G','Y'}; //byte array of characters byte[] byteArray1 = { 84, 69, 67, 72, 78, 79, 76, 79, 71, 89}; //array of ASCII values String s = new String(byteArray); //converts byteArray to String String str = new String(byteArray1); System.out.println(s); System.out.println(str); } }
انتاج:
تحتوي فئة String أيضًا على مُنشئ يمكننا من خلاله تمرير مصفوفة البايت ومجموعة الأحرف كوسيطة. لذلك يمكن أيضًا استخدام العبارة التالية لتحويل مجموعة البايت إلى سلسلة في Java.
String str = new String(byteArray, StandardCharsets.UTF_8)
تحتوي فئة السلسلة أيضًا على مُنشئ لتحويل مجموعة فرعية من مصفوفة البايت إلى سلسلة.
String(byte[] bytes, int offset, int length, String charsetName)
دعونا نرى مثالاً آخر يتم فيه استخدام ترميز مختلف.
مثال
import java.io.UnsupportedEncodingException; public class ByteArraytoStringExample3 { public static void main(String args[]) { try { byte[] bytes = new byte[] { 75, 69, 82, 115, 121, 90, 43, 98, -30}; //bytes in ASCII code String utf = new String(bytes, 'UTF-8'); //converts into UTF-8 encoding String cp1252 = new String(bytes, 'Cp1252'); //conversts into Cp1252 endcoding //converts into windows-1252 encoding String windows1252 = new String(bytes, 'Windows-1252'); System.out.println('String in UTF-8 encoding : ' + utf); System.out.println('String in Cp1252 encoding : ' + cp1252); System.out.println('string Windows-1252 encoding : ' + windows1252); } catch(Exception e) { e.printStackTrace(); } } }
انتاج: