Вот некоторые общие опции, заказанные от простого (острота) к комплексу (огромная библиотека).
Одно очень простое решение должен использовать BigInteger
шестнадцатеричное представление:
new BigInteger(1, someByteArray).toString(16)
Примечание, что, так как это обрабатывает числа не произвольный строки байтов , это опустит начальные нули - это может или не может быть тем, что Вы хотите (например, 000AE3
по сравнению с 0AE3
). Это также очень медленно, приблизительно [1 123] 50x медленнее по сравнению со следующей опцией.
Вот является полнофункциональным фрагментом кода, поддерживающим верхний/строчный и порядок байтов . Это оптимизировано, чтобы минимизировать сложность памяти и максимизировать производительность и должно быть совместимо со всеми современными версиями Java (5 +).
private static final char[] LOOKUP_TABLE_LOWER = new char[]{0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66};
private static final char[] LOOKUP_TABLE_UPPER = new char[]{0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46};
public static String encode(byte[] byteArray, boolean upperCase, ByteOrder byteOrder) {
// our output size will be exactly 2x byte-array length
final char[] buffer = new char[byteArray.length * 2];
// choose lower or uppercase lookup table
final char[] lookup = upperCase ? LOOKUP_TABLE_UPPER : LOOKUP_TABLE_LOWER;
int index;
for (int i = 0; i < byteArray.length; i++) {
// for little endian we count from last to first
index = (byteOrder == ByteOrder.BIG_ENDIAN) ? i : byteArray.length - i - 1;
// extract the upper 4 bit and look up char (0-A)
buffer[i << 1] = lookup[(byteArray[index] >> 4) & 0xF];
// extract the lower 4 bit and look up char (0-A)
buffer[(i << 1) + 1] = lookup[(byteArray[index] & 0xF)];
}
return new String(buffer);
}
public static String encode(byte[] byteArray) {
return encode(byteArray, false, ByteOrder.BIG_ENDIAN);
}
Это по существу использует код в опции 3. Если Вы хотите видеть некоторых , микро сравнительный тест JMH , сравнивая несколько реализаций, видит здесь . Полный исходный код с лицензией Apache v2 и декодером может быть найден здесь .
При работе над моим предыдущим проектом, я создал этот небольшой инструментарий для работы с байтами в Java. Это не имеет никаких внешних зависимостей и совместимо с Java 7 +. Это включает, среди других, очень быстрого и хорошо протестированного ШЕСТНАДЦАТЕРИЧНОГО en/decoder:
import at.favre.lib.bytes.Bytes;
...
Bytes.wrap(someByteArray).encodeHex()
можно проверить его на [1 114] GitHub: Java байтов .
, Конечно, существует польза 'ol кодеки свободного городского населения . ( мнение о предупреждении вперед ) При работе над проектом, обрисованным в общих чертах выше, я проанализировал код и был вполне разочарован; много дубликата неорганизованный код, устаревшие и экзотические кодеки, вероятно, только полезные для очень немногих и вполне по спроектированным и медленным реализациям популярных кодеков (конкретно Base64). Я поэтому сделал бы обоснованное решение, если Вы хотите использовать его или альтернатива. Так или иначе, если Вы все еще хотите использовать его, вот фрагмент кода:
import org.apache.commons.codec.binary.Hex;
...
Hex.encodeHexString(someByteArray));
, Как правило, Вы уже имеете Гуава как зависимость. Раз так просто используйте:
import com.google.common.io.BaseEncoding;
...
BaseEncoding.base16().lowerCase().encode(someByteArray);
, Если Вы используете платформа Spring с [1 118] безопасность Spring , можно использовать следующее:
import org.springframework.security.crypto.codec.Hex
...
Hex.encode(someByteArray);
В предыдущем Java (8, и ниже) присваивает версию коду Java для JAXB, был включен как зависимость во время выполнения. Начиная с Java 9 и модуляризация Мозаики Ваш код не может получить доступ к другому коду за пределами, он - модуль. Так знайте, если Вы получаете исключение как:
java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
при работе JVM с Java 9 +. Раз так тогда переключите реализации на любую из альтернатив выше. См. также этот вопрос .
Забавная маленькая задача.
Вот код:
StreamWatcher.cs
public class StreamWatcher : Stream
{
private Stream _base;
private MemoryStream _memoryStream = new MemoryStream();
public StreamWatcher(Stream stream)
{
_base = stream;
}
public override void Flush()
{
_base.Flush();
}
public override int Read(byte[] buffer, int offset, int count)
{
return _base.Read(buffer, offset, count);
}
public override void Write(byte[] buffer, int offset, int count)
{
_memoryStream.Write(buffer, offset, count);
_base.Write(buffer, offset, count);
}
public override string ToString()
{
return Encoding.UTF8.GetString(_memoryStream.ToArray());
}
#region Rest of the overrides
public override bool CanRead
{
get { throw new NotImplementedException(); }
}
public override bool CanSeek
{
get { throw new NotImplementedException(); }
}
public override bool CanWrite
{
get { throw new NotImplementedException(); }
}
public override long Seek(long offset, SeekOrigin origin)
{
throw new NotImplementedException();
}
public override void SetLength(long value)
{
throw new NotImplementedException();
}
public override long Length
{
get { throw new NotImplementedException(); }
}
public override long Position
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
#endregion
}
TitleModule.cs
public class TitleModule : IHttpModule
{
public void Dispose()
{
}
private static Regex regex = new Regex(@"(?<=<title>)[\w\s\r\n]*?(?=</title)", RegexOptions.Compiled | RegexOptions.IgnoreCase);
private StreamWatcher _watcher;
public void Init(HttpApplication context)
{
context.BeginRequest += (o, e) =>
{
_watcher = new StreamWatcher(context.Response.Filter);
context.Response.Filter = _watcher;
};
context.EndRequest += (o, e) =>
{
string value = _watcher.ToString();
Trace.WriteLine(regex.Match(value).Value.Trim());
};
}
}
На 4GuysFromRolla есть статья, в которой рассказывается о создании фильтров HttpResponse, которые в основном представляют собой потоки, которые обрабатывают ответ перед передачей его в конечный выходной поток (перехватчик).
http: / /aspnet.4guysfromrolla.com/articles/120308-1.aspx[1213 visible