คำนำ
เมื่อ Java สื่อสารกับโปรแกรมที่เขียนในภาษาอื่น ๆ ในซ็อกเก็ต TCP/IP เนื้อหาการสื่อสารจะถูกแปลงเป็นประเภทอาร์เรย์ byte และ Java ก็สะดวกมากในการแปลงอักขระและอาร์เรย์ ให้ฉันเรียนรู้เกี่ยวกับหลักการของการแปลงสตริงและ byte
หลักการ
เราทุกคนรู้ว่าใน Java ประเภท byte ใช้เวลา 1 ไบต์นั่นคือ 8 บิตในขณะที่ตัวละครเลขฐานสิบหกครอบครอง 4 บิตดังนั้นแต่ละ byte สามารถแสดงด้วยตัวละครสองตัวและในทางกลับกัน
ยกตัวอย่าง
ไบต์ = 123
ในการเป็นตัวแทนไบนารี: 0111 1011
แต่ละ 4 หลักแสดงด้วยตัวละคร: 7 b
ใช่หลักการคือง่าย ๆ ลองใช้รหัส:
Byte [] ถึง hexadecimal String
วิธีที่ 1
แนวคิด: แรกแปลง byte[] เป็นมิติ char[] จากนั้นแปลง char[] เป็นสตริง
สตริงคงที่สาธารณะ bytes2Hex (byte [] src) {ถ้า (src == null || src.length <= 0) {return null; } char [] res = char ใหม่ [src.length * 2]; // แต่ละไบต์สอดคล้องกับตัวละครสองตัวสุดท้าย hexdigits [] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', '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 บิตต่ำอีกครั้ง} ส่งคืนสตริงใหม่ (res); - วิธีที่ 2
แนวคิด: แรกแปลง byte เป็นประเภท int จากนั้นแปลงเป็นสตริง
สตริงคงที่สาธารณะ bytestohex (byte [] src) {ถ้า (src == null || src.length <= 0) {return null; } stringBuilder stringBuilder = new StringBuilder (""); สำหรับ (int i = 0; i <src.length; i ++) {// เหตุผลในการใช้ไบต์และ 0xff จะรวมกันเป็นเพราะ int คือ 32 บิต หลังจากจับคู่กับ 0xff 24 บิตแรกจะถูกยกเลิกและมีเพียง 8 บิตสุดท้ายเท่านั้นที่เก็บรักษาสตริง str = integer.tohexstring (src [i] & 0xff); if (str.length () <2) {// ถ้าจำเป็นต้องใช้บิตน้อยกว่าสองบิตต้องเพิ่ม stringbuilder.append (0); } StringBuilder.Append (STR); } return stringbuilder.toString (); - hexadecimal string to byte []
แนวคิด: ก่อนแปลงสตริงเป็น char[] จากนั้นแปลงเป็น byte[]
สาธารณะคงที่สาธารณะ [] hextobytes (string hexstring) {ถ้า (hexstring == null || hexstring.equals ("")) {return null; } int length = hexString.length () / 2; ถ่าน [] hexchars = hexstring.tochararray (); ไบต์ [] ไบต์ = ไบต์ใหม่ [ความยาว]; สตริง 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]); // note 2 ถ้า (h == -1 || l == -1) {// อักขระที่ไม่ใช่ hexadecimal ส่งคืน null; } bytes [i] = (ไบต์) (h | l); } คืนไบต์; - หมายเหตุ: หมายเหตุ 1 รับ xxxx0000 , note 2 ได้รับ 0000xxxx จากนั้นแปลงสองอักขระเป็น byte
ยกตัวอย่างอื่น
การเข้ารหัส MD5
สตริงคงที่สาธารณะ getMd5ByFile (ไฟล์ไฟล์) {สตริง ret = null; FileInputStream FIS = NULL; ลอง {fis = new FileInputStream (ไฟล์); MESAGEDIGEST MD = MESEGATEGEST.GETINSTANCE ("MD5"); ไบต์ [] บัฟเฟอร์ = ไบต์ใหม่ [1024]; int len; ในขณะที่ ((len = fis.read (บัฟเฟอร์))> 0) {md.update (บัฟเฟอร์, 0, len); } ret = bytes2Hex (md.digest ()); // แปลง md5 ที่เข้ารหัสไบต์ [] เป็นสตริง} catch (Exception e) {e.printstacktrace (); } ในที่สุด {ถ้า (fis! = null) {ลอง {fis.close (); } catch (ioexception e) {e.printstacktrace (); }}} return return; -สรุป
ตกลงฉันควรเข้าใจมันไม่ยาก ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่าเนื้อหาของบทความนี้จะช่วยในการศึกษาหรือทำงานของทุกคน หากคุณมีคำถามใด ๆ คุณสามารถฝากข้อความไว้เพื่อสื่อสาร