Элементарная задача в JAVA превращается в серьезную работу. Есть строка состоящая из символов 0123456789ABCDEF. Требуется представить ее массивом байт 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF. Или наоборот. Есть массив байт, полученный из потока, требуется представить его в виде строки, каждый символ которого определяет полубайт входного массива.
Решение:
Оригинал
Решение:
/***
* Представляет hexString строкой байт
* @param szMessage - исходная строка состоящая исключительно из символов "0123456789ABCDEF"
* @return массив байт содержащий исходную строку полубайтов, упакованную в байты
*/
public static byte[] toBytes( String szMessage){
if( szMessage == null || szMessage.length() == 0 ) return null;
int nLength = szMessage.length();
byte theBytes[] = new byte[nLength / 2];
for (int i = 0; i < nLength; i += 2) {
theBytes[i/2] = (byte) ((Character.digit(szMessage.charAt(i), 16) << 4) + Character.digit(szMessage.charAt(i+1), 16));
}
return theBytes;
}
Обратно:
/***
* Преобразует входной массив в hexString - строку полубайтов:
* 0x01, 0x23, 0x45 -> "012345"
* @param theBytes Входной массив байтов
* @param nOffset - смещение первого элемента в массиве
* @param nLength - количество байт для преобразования
* @return строка полубайтов
*/
public static String toString(byte[] theBytes, int nOffset, int nLength){
if(!is(theBytes, nOffset, nLength)) return "";
char[] theChars = new char[nLength * 2];
int nIndex = 0;
for ( byte nValue : theBytes ) {
if(nOffset > 0) {nOffset--; continue;}
theChars[nIndex * 2] = hexArray[(nValue & 0xFF) >>> 4];
theChars[nIndex * 2 + 1] = hexArray[nValue & 0x0F];
nIndex++;
if(--nLength <= 0) break;
}
return new String(theChars);
}
Оригинал
Комментариев нет:
Отправить комментарий