Предисловие
Когда Java общается с программами, написанными на других языках в TCP/IP -сокете, контент коммуникации обычно преобразуется в тип массива byte , а Java также очень удобен для конвертации символов и массивов. Позвольте мне узнать о принципе конвертации струн и byte
принцип
Мы все знаем, что в Java тип byte занимает 1 байт, то есть 8 бит, в то время как шестнадцатеричные символы занимают 4 бита, поэтому каждый byte может быть представлен двумя символами, и наоборот.
Привести пример
байт = 123
В бинарном представлении: 0111 1011
Каждые 4 цифры представлены символами: 7 b
Да, принцип такой простой, давайте реализуем его с помощью кода:
байт [] к шестнадцатеричной строке
Метод 1
Идея: сначала преобразовать byte[] в размерный char[] , а затем преобразовать char[] в строку
public Static String Bytes2Hex (byte [] src) {if (src == null || src.length <= 0) {return null; } char [] res = new char [src.length * 2]; // Каждый байт соответствует двум символам Final char hexdigits [] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'e', 'f'}; for (int i = 0, j = 0; i <src.length; i ++) {res [j ++] = hexdigits [src [i] >> 4 & 0x0f]; // Сохранить высокие 4 бита байта первого res [j ++] = hexdigits [src [i] & 0x0f]; // Сохранить низкие 4 бита байта снова} вернуть новую строку (res); } Метод 2
Идея: сначала преобразовать byte в тип int , затем преобразуйте в строку
public Static String ByteStohex (byte [] src) {if (src == null || src.length <= 0) {return null; } StringBuilder stringBuilder = new StringBuilder (""); для (int i = 0; i <src.length; i ++) {// Причина использования байта и 0xff должна быть объединена, потому что int составляет 32 бита. После сопоставления с 0xff первые 24 бита отбрасываются, и только последние 8 бит сохраняются string str = integer.tohexstring (src [i] & 0xff); if (str.length () <2) {// Если необходимо менее двух битов, 0 должно быть добавлено stringbuilder.append (0); } stringBuilder.append (str); } return stringBuilder.toString (); } Шестнадцатеричная струна до байта []
Идея: сначала преобразовать строку в char[] , затем преобразовать ее в byte[]
public Static Byte [] hextobytes (String hexstring) {if (hexstring == null || hexstring.equals ("")) {return null; } int length = hexstring.length () / 2; char [] hexchars = hexstring.thararray (); байт [] байты = новый байт [длина]; String hexdigits = "0123456789abcdef"; for (int i = 0; i <length; i ++) {int pos = i * 2; // два символа соответствуют одному байтовому int h = hexdigits.indexof (hexchars [pos]) << 4; // Примечание 1 int l = hexdigits.indexof (hexchars [pos + 1]); // ПРИМЕЧАНИЕ 2 if (h == -1 || l == -1) {// не -гексадецимальные символы возвращают null; } bytes [i] = (byte) (h | l); } вернуть байты; } Примечание. Примечание 1 получает xxxx0000 , примечание 2 получает 0000xxxx , а затем преобразует два символа в byte .
Привести еще один пример
шифрование MD5
public Static String getMd5byfile (файл файла) {string ret = null; FileInputStream fis = null; try {fis = new FileInputStream (file); MessageDigest MD = MOSSAGEDIGEST.GETINSTANCE ("MD5"); Byte [] buffer = новый байт [1024]; int len; while ((len = fis.read (buffer))> 0) {md.update (буфер, 0, len); } ret = bytes2Hex (md.digest ()); // преобразовать зашифрованный байт MD5 [] в строку} catch (Exception e) {e.printstackTrace (); } наконец {if (fis! = null) {try {fis.close (); } catch (ioException e) {e.printstackTrace (); }}} return return; }Суммировать
Хорошо, я должен понять, это не сложно. Вышеуказанное - все содержание этой статьи. Я надеюсь, что содержание этой статьи поможет всем, кто учится или работа. Если у вас есть какие -либо вопросы, вы можете оставить сообщение для общения.