2017-10-09 139 views
-3

如果问题不明确,我想知道在将数据写入文件的过程中,哪些类型的输入或操作可以使它们从文本文件转换为二进制文件?什么可以让文件变成二进制后的wirtten?

原因的问题:
我刚开始我的方式进入(Java)的加密和我做了一个简单的程序,读取从现有的文件中的文本,并对其进行加密后,它在将加密的消息发回文件。

问题:
有时文件保持在“文本”,显示从加密一些ramdom符号和字母,但其他时候,它变成了二进制文件,并运行,尽管一些测试,我似乎无法理解有什么事情是原因。

实施例:

含有单词 “test”,

- 附文件
预期输出:�Ҋ5�)>;

导致文件:�Ҋ5�)>;

包含单词 “消息”

- 附的文件,
预期输出:�̮�~��<-�L��%

结果File:File turned int二进制

注:我非常积极,它不依赖于单词,我猜测它可能与它生成的加密符号有关,但我可能是错的。

万一它很有用: 我目前正在使用Ubunto并使用“gedit”创建文本文件。

代码:(我appologize的尝试/捕获)

public static void main(String args[]) throws NoSuchAlgorithmException, IOException{ 

    Scanner sc = new Scanner(System.in); 
    System.out.println("Nome fo ficheiro:"); 
    String fileName = sc.nextLine(); 
    byte [] byteMsg = getByteMsg(fileName); 


    //* Declare Encriptor--> Cipher// 
    Cipher cifrador = null; 
    try { 
     cifrador = Cipher.getInstance("DES"); 
    } catch (NoSuchPaddingException ex) { 
     System.out.println("Problema na mensagem"); 
    } 


    //* Generate key --> KeyGenerator*// 
    KeyGenerator kgen = null; 
    try{ 
     kgen = KeyGenerator.getInstance("DES"); 
    } 
    catch(NoSuchAlgorithmException e){ 
     System.out.println("Algoritmo de encriptação não encontrado"); 
    } 
    SecretKey key = kgen.generateKey(); 


    //* Inicialize Encritptor and encrypt message* --> Cipher// 
    try { 
     cifrador.init(1, key); //1 = Cipher.ENCRYPT_MODE 

    } catch (InvalidKeyException ex) { 
     System.out.println("Chave de cifragem inválida"); 
    } 
    byte[]byteMsgCod = null; 
    try { 
     byteMsgCod = cifrador.doFinal(byteMsg); 
    } catch (IllegalBlockSizeException ex) { 
     System.out.println("Tamanho de Bloco Ilegal"); 
    } catch (BadPaddingException ex) { 
     System.out.println("Bad Padding"); 
    } 



    //* Write encrypted message in the file*// 
    PrintWriter pw = new PrintWriter(fileName); 
    String msgCod = new String(byteMsgCod); 
    System.out.println(msgCod); 
    pw.println(msgCod); 
    pw.close(); 



    /* Read text from file */ 
} 
private static byte[] getByteMsg(String fileName) throws IOException{ 
    //Ler msg do ficheiro 
    Scanner sc = new Scanner(System.in); 
    FileInputStream fis = null; 

    try { 
     fis = new FileInputStream(fileName); 
    } catch (FileNotFoundException ex) { 
     System.out.println("Ficheiro não encontrado"); 
    } 

    byte[] byteMsg = new byte[fis.available()]; 

    fis.close(); 

    return byteMsg; 
} 
+1

**所有**文件都是二进制文件 –

+3

所有文件都是二进制文件。你看到的是不可打印的字符(字符少于十进制32(0x20)。请参阅任何ASCII图表。 –

+0

@KenWhite我不确定这是否正确,但是这意味着当通过加密生成不可打印的字符时,文件格式将更改以适应事实,即并非所有这些字符都是可打印的,因此可以在正常的“文本”格式? – Fosh

回答

4

所有的文件是二进制文件。从你理解它的角度来看,并没有真正的“文本文件”。

有这样一个事情,偶然的情况下,碰巧包含一个完全代表UTF8字符串的编码字节序列。但它仍然是一个二进制文件。

对于任何其他编码都可以这么说。

0

除了是二进制的所有文件:

  1. 加密的数据不是文本。
  2. String不是二进制数据的容器。
  3. Writers不是写入二进制数据的有效方法。
  4. Javadoc中有一个特定的警告,反对使用available()
+0

FileWriter没有使用,但谢谢不管。 – Fosh

+0

'PrintWriter'被使用,同样的区别。 – EJP