如何将二进制文本转换为可用文件

时间:2013-12-08 22:42:00

标签: java binary file-conversion

所以我使用以下方法

(文件通过'convertFileToByteArray()'转换为字节数组,然后通过'convertByteArrayToBitTextFile()'

写入.txt文件

将任何类型的文件转换为二进制文本文件(我认为这只是人类可读形式的1和0)。

public static byte[] convertFileToByteArray(String path) throws IOException
{
    File file = new File(path);
    byte[] fileData;
    fileData = new byte[(int)file.length()];
    FileInputStream in = new FileInputStream(file);
    in.read(fileData);
    in.close();
    return fileData;
}

public static boolean convertByteArrayToBitTextFile(String path, byte[] bytes)
{
    String content = convertByteArrayToBitString(bytes);
    try
    {
        PrintWriter out = new PrintWriter(path);
        out.println(content);
        out.close();
        return true;
    }
    catch (FileNotFoundException e)
    {
        return false;
    }
}

public static String convertByteArrayToBitString(byte[] bytes)
{
    String content = "";
    for (int i = 0; i < bytes.length; i++)
    {
        content += String.format("%8s", Integer.toBinaryString(bytes[i] & 0xFF)).replace(' ', '0');
    }
    return content;
}

修改:附加代码:

public static byte[] convertFileToByteArray(String path) throws IOException
{
    File file = new File(path);
    byte[] fileData;
    fileData = new byte[(int)file.length()];
    FileInputStream in = new FileInputStream(file);
    in.read(fileData);
    in.close();
    return fileData;
}

public static boolean convertByteArrayToBitTextFile(String path, byte[] bytes)
{
    try
    {
        PrintWriter out = new PrintWriter(path);
        for (int i = 0; i < bytes.length; i++)
        {
            out.print(String.format("%8s", Integer.toBinaryString(bytes[i] & 0xFF)).replace(' ', '0'));
        }
        out.close();
        return true;
    }
    catch (FileNotFoundException e)
    {
        return false;
    }
}

public static boolean convertByteArrayToByteTextFile(String path, byte[] bytes)
{
    try
    {
        PrintWriter out = new PrintWriter(path);
        for(int i = 0; i < bytes.length; i++)
        {
            out.print(bytes[i]);
        }
        out.close();
        return true;
    }
    catch (FileNotFoundException e)
    {
        return false;
    }
}

public static boolean convertByteArrayToRegularFile(String path, byte[] bytes)
{
    try
    {
        PrintWriter out = new PrintWriter(path);
        for(int i = 0; i < bytes.length; i++)
        {
            out.write(bytes[i]);
        }
        out.close();
        return true;
    }
    catch (FileNotFoundException e)
    {
        return false;
    }
}

public static boolean convertBitFileToByteTextFile(String path) 
{
    try
    {
        byte[] b = convertFileToByteArray(path);
        convertByteArrayToByteTextFile(path, b);
        return true;
    }
    catch (IOException e)
    {
        return false;
    }

}

我这样做是为了在非常基础的层面上尝试压缩方法,所以请不要讨论为什么要使用人类可读的形式。

到目前为止,这种方法运作良好,但我遇到了两个问题。

1) 它需要(对于二进制文本,大约需要20分钟,230KB)。这只是相对复杂的转换的副产品还是有其他方法可以更快地完成这项工作?

2)和主要问题: 我不知道如何将文件转换回原来的样子。从.txt重命名为.exe不起作用(不太令人惊讶,因为生成的文件比原始文件大两倍)

这仍然是可能的,或者我是否通过将文件转换为人类可读的文本文件而丢失了文件应该表示的信息? 如果是这样,你知道任何阻止这种情况的替代方案吗?

感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

你花费最多时间的事情是构建一个不断增加的字符串。更好的方法是尽快写入数据。

另一个问题很简单。您知道每个八个字符('0'或'1')的序列都是由一个字节组成的。因此,您知道8个字符块中每个字符的值:

01001010
       ^----- 0*1
      ^------ 1*2
     ^------- 0*4
    ^-------- 1*8
   ^--------- 0*16
  ^---------- 0*32
 ^----------- 1*64
^------------ 0*128
              -----
              64+8+2 = 74

您只需要添加“1”所在的值。

你可以用这样的Java来做,甚至不知道各个比特值:

String sbyte = "01001010";
int bytevalue = 0;
for (i=0; i<8; i++) {
    bytevalue *= 2;           // shifts the bit pattern to the left 1 position
    if (sbyte.charAt(i) == '1') bytevalue += 1;
}

答案 1 :(得分:2)

  1. 使用StringBuilder可避免生成大量未使用的String个实例 更好的是,直接写入PrintWriter而不是在内存中构建它。

  2. 遍历每个8个字符的子序列,并调用Byte.parseByte(text, 2)将其解析回一个字节。