转换给定InputStream的字节序列

时间:2011-01-20 15:31:51

标签: java

在Java中,在给定字节序列(最好表示为十六进制)的情况下,是否有任何库可以转换为给定InputStream的另一个字节序列?例如:

InputStream input = new FileInputStream(new File(...));
OutputStream output = new FileOutputStream(new File(...));
String fromHex = "C3BEAB";
String toHex = "EAF6"
MyMagicLibrary.translate(fromHex, toHex, input, output)

所以如果输入文件(十六进制看起来像)

00 00 12 18 33 C3 BE AB 00 23 C3 BE AB 00

翻译后,结果将是

00 00 12 18 33 EA F6 00 23 EA F6 00

4 个答案:

答案 0 :(得分:2)

一旦我使用正则表达式做了这样的事情(用于简单地修补exe文件)。我将整个输入读入byte[]并使用latin1转换为String,然后进行替换并转换回来。它没有效率,但根本没有关系。你不需要正则表达式,简单的String.replace就可以。

但在你的情况下,它可以非常简单而有效地完成:

int count = 0;
while (true) {
    int n = input.read();
    if (n == (fromAsByteArray[count] & 255)) {
        ++count;
        if (count==fromAsByteArray.length) { // match found
            output.write(toAsByteArray);
            count = 0;
        }
    } else { // mismatch
        output.write(fromAsByteArray, 0, count); // flush matching chars so far
        count = 0;
        if (n == -1) break;
        output.write(n);
        }
    }
}

答案 1 :(得分:0)

如果你的意思是你想要使用从十六进制转换为十六进制的类 这是我常用的两种方法,你可以将它们放在一个类中并在任何你想要的地方重用它

public static String toHex(byte buf[]) {
    StringBuffer strbuf = new StringBuffer(buf.length * 2);
    int i;

    for (i = 0; i < buf.length; i++) {
        if (((int) buf[i] & 0xff) < 0x10) {
            strbuf.append("0");
        }

        strbuf.append(Long.toString((int) buf[i] & 0xff, 16));
    }

    return strbuf.toString();
}

public static byte[] fromHexString(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)
                + Character.digit(s.charAt(i + 1), 16));
    }
    return data;
}

实际上我并不了解代码中的每一行,但我通常会重复使用它们。

答案 2 :(得分:0)

由于您的输入可以包含空格,因此您首先需要清理输入以删除空格。读完一对字符后,只需使用Byte.parseByte(twoCharString,16),然后使用String.format转换回String。

尽管容易测试,但是逐字节地执行它很可能非常低效。一旦你得到你想要的结果,你可以通过读取和解析整个缓冲区并一次吐出多个结果字节来调整它,每行可能有16个字节的字符用于格式化。这一切都取决于你。

答案 3 :(得分:0)

实现此目的的一种方法是使用IOUtils和String replace方法。

public static void translate(byte[] fromHex, byte[] toHex, InputStream input, OutputStream output) throws IOException {
    IOUtils.write(translate(fromHex, toHex, IOUtils.toByteArray(input)), output);
}

public static byte[] translate(byte[] fromHex, byte[] toHex, byte[] inBytes) throws UnsupportedEncodingException {
    String inputText = new String(inBytes, "ISO-8859-1");
    String outputText = inputText.replace(new String(fromHex, "ISO-8859-1"), new String(toHex, "ISO-8859-1"));
    return outputText.getBytes("ISO-8859-1");
}