مقدمة
عندما تتواصل Java مع البرامج المكتوبة بلغات أخرى في Socket TCP/IP ، يتم تحويل محتوى الاتصال بشكل عام إلى نوع صفيف byte ، كما أن Java مريحة للغاية لتحويل الأحرف والصفائف. اسمحوا لي أن أتعرف على مبدأ تحويل السلاسل byte
مبدأ
نعلم جميعًا أنه في جافا ، يأخذ نوع byte بايت 1 ، أي 8 بتات ، في حين أن الشخصيات السداسية تشغل 4 بتات ، بحيث يمكن تمثيل كل byte بواسطة حرفين ، والعكس صحيح.
إعطاء مثال
بايت = 123
في التمثيل الثنائي: 0111 1011
يتم تمثيل كل 4 أرقام بأحرف: 7 b
نعم ، المبدأ هو هذا بسيط ، دعنا ننفذه بالرمز:
بايت [] إلى سلسلة سداسية عشرية
الطريقة 1
الفكرة: أولاً تحويل byte[] إلى char[] ، ثم تحويل char[]
السلسلة الثابتة العامة bytes2Hex (byte [] src) {if (src == null || src.length <= 0) {return null ؛ } char [] res = new char [src.length * 2] ؛ // كل بايت يتوافق مع حرفين char hexdigits النهائي [] = {'0' ، '1' ، '2' ، '3' ، '4' ، '5 ،' 6 '،' 7 '،' 8 '،' 9 '،' '،' b '،' d '،' e '،' f '} ؛ لـ (int i = 0 ، j = 0 ؛ i <src.length ؛ i ++) {res [j ++] = hexDigits [src [i] >> 4 & 0x0f] ؛ // حفظ 4 بتات من البايت الأول الدقة [j ++] = hexDigits [src [i] & 0x0f] ؛ // احفظ 4 بتات من البايت مرة أخرى} إرجاع سلسلة جديدة (الدقة) ؛ } الطريقة 2
الفكرة: أولاً تحويل byte إلى نوع int ، ثم قم بتحويلها إلى سلسلة
السلسلة الثابتة العامة bytestohex (byte [] src) {if (src == null || src.length <= 0) {return null ؛ } StringBuilder StringBuilder = جديد StringBuilder ("") ؛ لـ (int i = 0 ؛ i <src.length ؛ i ++) {// سبب استخدام البايت و 0xff هو الجمع بين int هو 32 بت. بعد مطابقة مع 0xFF ، يتم التخلص من أول 24 بت ، ولا يتم الاحتفاظ بالسلسلة الثمانية الأخيرة فقط str = integer.toHexString (SRC [i] & 0xff) ؛ if (str.length () <2) {// إذا كانت هناك حاجة إلى أقل من بتات ، يجب إضافة 0 stringBuilder.Append (0) ؛ } StringBuilder.Append (str) ؛ } return stringBuilder.toString () ؛ } سلسلة سداسية عشرية إلى بايت []
الفكرة: أولاً قم بتحويل السلسلة إلى char[] ، ثم قم بتحويلها إلى byte[]
البايت الثابت العام [] Hextobytes (سلسلة hexstring) {if (hexString == null || hexstring.equals ("")) {return null ؛ } int length = hexstring.length () / 2 ؛ char [] hexchars = hexstring.tochararray () ؛ بايت [] بايت = بايت جديد [طول] ؛ String hexDigits = "0123456789ABCDEF" ؛ لـ (int i = 0 ؛ i <length ؛ i ++) {int pos = i * 2 ؛ // اثنين من الحرفين تتوافق مع بايت واحد int h = hexdigits.indexof (hexchars [pos]) << 4 ؛ // note 1 int l = hexdigits.indexof (hexchars [pos + 1]) ؛ // ملاحظة 2 if (h == -1 || l == -1) {// أحرف غير hexadecimal إرجاع فارغة ؛ } bytes [i] = (byte) (h | l) ؛ } إرجاع بايت ؛ } ملاحظة: يحصل الملاحظة 1 على xxxx0000 ، الحاشية 2 تحصل على 0000xxxx ، ثم يحول حرفين إلى byte .
إعطاء مثال آخر
تشفير MD5
السلسلة الثابتة العامة getMD5ByFile (ملف الملف) {String ret = null ؛ FileInputStream Fis = NULL ؛ حاول {fis = new FileInputStream (file) ؛ messagedigest md = messagedigest.getInstance ("MD5") ؛ Byte [] Buffer = New Byte [1024] ؛ int len ؛ بينما ((len = fis.read (buffer))> 0) {md.update (buffer ، 0 ، len) ؛ } ret = bytes2Hex (md.digest ()) ؛ // تحويل md5 byte المشفرة [] إلى سلسلة} catch (استثناء e) {eprintstacktrace () ؛ } أخيرًا {if (fis! = null) {try {fis.close () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ }}} إرجاع الإرجاع ؛ }لخص
حسنًا ، يجب أن أفهم ، ليس الأمر صعبًا. ما سبق هو المحتوى الكامل لهذه المقالة. آمل أن يكون محتوى هذه المقالة من بعض المساعدة في دراسة أو عمل الجميع. إذا كان لديك أي أسئلة ، فيمكنك ترك رسالة للتواصل.