我有一个用十六进制数字填充并打印的字节数组,简单的方法是毫无意义的java 16进制字符串转换,因为有许多不可打印的元素。 我需要的是以下形式的确切十六进制代码:
#1楼
最简单的解决方案,没有外部库,没有数字常量:
public static String byteArrayTo[Hex]6 {
StringBuilder sb = new StringBuilder(a.length * 2);
for(byte b: a)
sb.append(String.format("x", b));
return sb.toString();
}
#2楼
这个简单的对我有用
= new (1, ).(16);
编辑-使用此方法将删除前导零,但是嘿在我的用例中工作过。 感谢@Voicu指出
#3楼
//移位字节更有效//您也可以使用此字节
public static String getHexString (String s)
{
byte[] buf = s.getBytes();
StringBuffer sb = new StringBuffer();
for (byte b:buf)
{
sb.append(String.format("%x", b));
}
return sb.toString();
}
#4楼
以少量的存储查找表的代价,该实现简单且非常快速。
private static final char[] BYTE2HEX=(
"000102030405060708090A0B0C0D0E0F"+
"101112131415161718191A1B1C1D1E1F"+
"202122232425262728292A2B2C2D2E2F"+
"303132333435363738393A3B3C3D3E3F"+
"404142434445464748494A4B4C4D4E4F"+
"505152535455565758595A5B5C5D5E5F"+
"606162636465666768696A6B6C6D6E6F"+
"707172737475767778797A7B7C7D7E7F"+
"808182838485868788898A8B8C8D8E8F"+
"909192939495969798999A9B9C9D9E9F"+
"A0A1A2A3A4A5A6A7A8A9AAABACADAEAF"+
"B0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF"+
"C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF"+
"D0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF"+
"E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF"+
"F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF").toCharArray();
;
public static String getHexString(byte[] bytes) {
final int len=bytes.length;
final char[] chars=new char[len 4];
hexChars[j * 2 + 1] = hexArray[v & 0x0F];
}
return new String(hexChars);
}
它稍微适应了接受的答案。 就我个人而言,我保留了已接受的答案和此重载以及更多的答案,可在更多情况下使用。
#8楼
@n提出的解决方案的一个小变形,它使您可以在输出十六进制字符串中将N个字节可视地捆绑在一起:
final static char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray();
final static char BUNDLE_SEP = ' ';
public static String bytesToHexString(byte[] bytes, int bundleSize /*[bytes]*/]) {
char[] hexChars = new char[(bytes.length * 2) + (bytes.length / bundleSize)];
for (int j = 0, k = 1; j < bytes.length; j++, k++) {
int v = bytes[j] & 0xFF;
int start = (j * 2) + j/bundleSize;
hexChars[start] = HEX_ARRAY[v >>> 4];
hexChars[start + 1] = HEX_ARRAY[v & 0x0F];
if ((k % bundleSize) == 0) {
hexChars[start + 2] = BUNDLE_SEP;
}
}
return new String(hexChars).trim();
}
那是:
bytesToHexString("..DOOM..".toCharArray().getBytes(), 2);
2E2E 444F 4F4D 2E2E
bytesToHexString("..DOOM..".toCharArray().getBytes(), 4);
2E2E444F 4F4D2E2E
#9楼
这个怎么样?
String byteToHex(final byte[] hash)
{
Formatter formatter = new Formatter();
for (byte b : hash)
{
formatter.format("x", b);
}
String result = formatter.toString();
formatter.close();
return result;
}
#10楼
如果您正在寻找与完全一样的字节数组,那么我已经将此Java实现转换为。
class ByteArray:
@classmethod
def char(cls, args=[]):
cls.hexArray = "0123456789ABCDEF".encode('utf-16')
j = 0
length = (cls.hexArray)
if j < length:
v = j & 0xFF
hexChars = [None, None]
hexChars[j * 2] = str( cls.hexArray) + str(v)
hexChars[j * 2 + 1] = str(cls.hexArray) + str(v) + str(0x0F)
# Use if you want...
#hexChars.pop()
return str(hexChars)
array = ByteArray()
print array.char(args=[])
#11楼
番石榴解决方案,以确保完整性:
import com.google.common.io.BaseEncoding;
...
byte[] bytes = "Hello world".getBytes(StandardCharsets.UTF_8);
final String hex = BaseEncoding.base16().lowerCase().encode(bytes);
现在, hex是"64" 。
#12楼
使用类javax.xml.bind.
= .(bytes[] raw);
#13楼
好的,有很多方法可以做到这一点,但是如果您决定使用一个库,我建议您在项目中仔细研究一下,看看是否已经在已经属于项目的库中实现了某些功能,然后再添加新的库只是为了做到这一点。 例如,如果您还没有
mons.codec..Hex
也许你有...
org...impl.dv.util.
#14楼
我会使用类似的方法来固定长度,例如散列:
md5sum = String.format("2x", new BigInteger(1, md.digest()));
#15楼
public static byte[] hexStringToByteArray(String s) {
int len = s.length();
byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) 4];
value[j++]=toHex[octet&0xF];
}
return new String(value);
}
static final Encoder LOWER=new Encoder(false);
static final Encoder UPPER=new Encoder(true);
}
public static Encoder getEncoder(){
return Encoder.LOWER;
}
public static Encoder getUpperEncoder(){
return Encoder.UPPER;
}
//...
}
#17楼
private static String bytesToHexString(byte[] bytes, int length) {
if (bytes == null || length == 0) return null;
StringBuilder ret = new StringBuilder(2*length);
for (int i = 0 ; i < length ; i++) {
int b;
b = 0x0f & (bytes[i] >> 4);
ret.append("0123456789abcdef".charAt(b));
b = 0x0f & bytes[i];
ret.append("0123456789abcdef".charAt(b));
}
return ret.toString();
}
#18楼
在此页面上找不到无法解决的任何解决方案
使用循环 使用javax.xml.bind.可以很好地编译,但是经常在运行时抛出java.lang.。
这是一个没有上述缺陷的解决方案(虽然我的承诺不会有其他缺陷)
import java.math.BigInteger;
import static java.lang.System.out;
public final class App2 {
// | proposed solution.
public static String encode(byte[] bytes) {
final int length = bytes.length;
// | BigInteger constructor throws if it is given an empty array.
if (length == 0) {
return "00";
}
final int evenLength = (int)(2 * Math.ceil(length / 2.0));
final String format = "%0" + evenLength + "x";
final String result = String.format (format, new BigInteger(bytes));
return result;
}
public static void main(String[] args) throws Exception {
// 00
out.println(encode(new byte[] {}));
// 01
out.println(encode(new byte[] {1}));
//203040
out.println(encode(new byte[] {0x20, 0x30, 0x40}));
// 416c6c20796f75722062617365206172652062656c6f6e6720746f2075732e
out.println(encode("All your base are belong to us.".getBytes()));
}
}
我无法在62个操作码下得到此信息,但是如果您可以不使用0填充来防止第一个字节小于0x10,那么以下解决方案将仅使用23个操作码。 确实显示了如果没有本机实现(或者在这种情况下,如果可以在其中以零作为前缀的选项)的话,例如“如果字符串长度为奇数,则用零填充”之类的“易于实现自己”的解决方案会变得非常昂贵。 )。
public static String encode(byte[] bytes) {
final int length = bytes.length;
// | BigInteger constructor throws if it is given an empty array.
if (length == 0) {
return "00";
}
return new BigInteger(bytes).toString(16);
}
#19楼
我的解决方案基于也许的解决方案,但不依赖于任何额外分配的查找表。 它不使用任何“从字符到字符”的强制转换(实际上, .()做到了,进行一些比较以检查数字的真实含义),因此可能会慢一些。 请随时随地使用它。 干杯。
public static String bytesToHex(final byte[] bytes)
{
final int numBytes = bytes.length;
final char[] container = new char[numBytes * 2];
for (int i = 0; i < numBytes; i++)
{
final int b = bytes[i] & 0xFF;
container[i * 2] = Character.forDigit(b >>> 4, 0x10);
container[i * 2 + 1] = Character.forDigit(b & 0xF, 0x10);
}
return new String(container);
}
#20楼
如果您使用的是 框架,则可以使用:
import org.springframework.security.crypto.codec.Hex
final String testString = "Test String";
final byte[] byteArray = testString.getBytes();
System.out.println(Hex.encode(byteArray));
#21楼
Converts bytes data to hex characters
@param bytes byte array to be converted to hex string
@return byte String in hex format
private static String bytesToHex(byte[] bytes) {
char[] hexChars = new char[bytes.length * 2];
int v;
for (int j = 0; j < bytes.length; j++) {
v = bytes[j] & 0xFF;
hexChars[j * 2] = HEX_ARRAY[v >>> 4];
hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F];
}
return new String(hexChars);
}
#22楼
为简单功能添加实用程序jar不是一个好选择。 而是汇编您自己的实用程序类。 以下是可能的更快实施。
<p><pre>public class ByteHex {
public static int hexToByte(char ch) {
if ('0'