تحويل مصفوفات البايت إلى سلاسل سداسية عشرية مهمة شائعة في جافا، غالبًا ما تكون ضرورية للتصحيح، أو التسجيل، أو نقل البيانات. تستعرض هذه المقالة عدة طرق فعّالة لإنجاز هذا التحويل، مع مقارنة أدائها وسهولة استخدامها.
محتويات
- التحويل اليدوي باستخدام HEX_ARRAY
- استخدام Apache Commons Codec
- الاستفادة من DatatypeConverter
- نهج تنسيق السلسلة
- مقارنة الأداء
التحويل اليدوي باستخدام HEX_ARRAY
تستخدم هذه الطريقة مصفوفة أحرف مُعرّفة مسبقًا لربط قيم البايت بتمثيلاتها السداسية عشرية. وهي توفر أداءً جيدًا لمصفوفات البايت الأصغر حجمًا وتتجنب الاعتماديات الخارجية.
public class ByteArrayToHex {
private static final char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray();
public static String bytesToHex(byte[] bytes) {
char[] hexChars = new char[bytes.length * 2];
for (int j = 0; j >> 4];
hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F];
}
return new String(hexChars);
}
public static void main(String[] args) {
byte[] byteArray = { (byte) 0xA1, (byte) 0xB2, (byte) 0xC3, (byte) 0xD4 };
String hexString = bytesToHex(byteArray);
System.out.println("السلسلة السداسية عشرية: " + hexString); // الإخراج: السلسلة السداسية عشرية: A1B2C3D4
}
}
استخدام Apache Commons Codec
توفر مكتبة Apache Commons Codec طريقة Hex.encodeHexString() المريحة. وهذا حل قوي وواسع الانتشار، ولكنه يتطلب إضافة اعتماد إلى مشروعك (مثلًا، باستخدام Maven).
import org.apache.commons.codec.binary.Hex;
public class ByteArrayToHexApache {
public static void main(String[] args) {
byte[] byteArray = { (byte) 0xA1, (byte) 0xB2, (byte) 0xC3, (byte) 0xD4 };
String hexString = Hex.encodeHexString(byteArray);
System.out.println("السلسلة السداسية عشرية: " + hexString); // الإخراج: السلسلة السداسية عشرية: A1B2C3D4
}
}
الاستفادة من DatatypeConverter
توفر فئة javax.xml.bind.DatatypeConverter المدمجة في جافا (متوفرة منذ جافا 6) طريقة printHexBinary(). هذا خيار بسيط، وخالٍ من الاعتماديات.
import javax.xml.bind.DatatypeConverter;
public class ByteArrayToHexDatatypeConverter {
public static void main(String[] args) {
byte[] byteArray = { (byte) 0xA1, (byte) 0xB2, (byte) 0xC3, (byte) 0xD4 };
String hexString = DatatypeConverter.printHexBinary(byteArray);
System.out.println("السلسلة السداسية عشرية: " + hexString); // الإخراج: السلسلة السداسية عشرية: A1B2C3D4
}
}
نهج تنسيق السلسلة
تستخدم هذه الطريقة String.format() ضمن حلقة. بينما هي وظيفية، إلا أنها أقل كفاءة بشكل عام من الطرق الأخرى، خاصةً لمصفوفات البايت الأكبر حجمًا، نظرًا لزيادة تكلفة دمج السلاسل المتكررة.
public class ByteArrayToHexAppendFormat {
public static String bytesToHex(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(String.format("%02X", b));
}
return sb.toString();
}
public static void main(String[] args) {
byte[] byteArray = { (byte) 0xA1, (byte) 0xB2, (byte) 0xC3, (byte) 0xD4 };
String hexString = bytesToHex(byteArray);
System.out.println("السلسلة السداسية عشرية: " + hexString); // الإخراج: السلسلة السداسية عشرية: A1B2C3D4
}
}
مقارنة الأداء
بالنسبة لمصفوفات البايت الصغيرة، تكون الاختلافات في الأداء بين هذه الطرق ضئيلة. ومع ذلك، بالنسبة للمصفوفات الأكبر حجمًا، تتفوق طريقة HEX_ARRAY اليدوية و Apache Commons Codec بشكل عام على نهج String.format(). توفر DatatypeConverter توازنًا جيدًا بين الأداء وسهولة الاستخدام بدون اعتماديات خارجية.
يعتمد الخيار الأفضل على احتياجات مشروعك المحددة. إذا كان الأداء أمرًا بالغ الأهمية، وكنت تعمل مع مجموعات بيانات كبيرة، يُنصح باستخدام طريقة HEX_ARRAY أو Apache Commons Codec. إذا كانت البساطة وتجنب الاعتماديات الخارجية أولوية، فإن DatatypeConverter خيار ممتاز.