在文件中将字符串转换为二进制,再将其转换回字符串的JAVA操作

3
我想要从文件中读取文本,例如"Hello",然后将该文本转换为对应的二进制形式,如下所示:01001000 01100101 01101100 01101100 01101111 现在,在进行二进制转换之后,我想再次将相同的01001000 01100101 01101100 01101100 01101111转换为Hello并将其写入文件。
而且,如果有多个单词,例如"Hello World my name is XYZ",我该怎么做呢?
请问如何实现?请帮忙。

1
请查看Integer.toString(...)、Integer.parseInt(...)、String.getBytes(...)以及String(byte[],...)方法和构造函数。 - President James K. Polk
@GregS 如果需要直接编程位访问,则可以将 BitSet 部署在 String.getBytes 的结果上。那个类一定有一些用例吧? - Maarten Bodewes
学习如何将数字乘以2和除以2...以及学习如何逐字节读写文件。 - CharlieS
2个回答

4

我未深入介绍如何读写文件,因为您可以查找相关信息。但是,要实现您想要的功能:

  • 您将需要一种将单词转换为二进制的方法
  • 然后,您需要另一种将二进制转换为单词的方法

下面是代码:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class HelloWorld{

 public static void main(String []args) throws FileNotFoundException {
   File file = new File("input.txt");
   Scanner sc = new Scanner(file);
   String word=sc.nextLine();
   String receivedBinary=stringToBinary(word);
   System.out.println();
   String receivedWord=BinaryToString(receivedBinary);
 }
 public static String stringToBinary(String text)
 {
     String bString="";
     String temp="";
     for(int i=0;i<text.length();i++)
     {
         temp=Integer.toBinaryString(text.charAt(i));
         for(int j=temp.length();j<8;j++)
         {
             temp="0"+temp;
         }
         bString+=temp+" ";
     }

     System.out.println(bString);
     return bString;
 }
 public static String BinaryToString(String binaryCode)
 {
     String[] code = binaryCode.split(" ");
     String word="";
     for(int i=0;i<code.length;i++)
     {
         word+= (char)Integer.parseInt(code[i],2);
     }
     System.out.println(word);
     return word;
 }
}

有点遗憾的是,Integer.toBinaryString 并不总是打印出一个字节的所有位,也许你应该编写子程序来解决这个问题。word+= (char)Integer.parseInt(code[i],2); 感觉不太正确。 - Maarten Bodewes
对不起,没注意到。我只是添加了一些填充,这样它就总是显示8个字符。 - luisluix

0

好的,因为我喜欢谜题,并且Java语言可以更好地支持这种低级数组操作。我创造了一个术语 "bitgets" 来表示0和1的字符表示形式,以及一个方法 toBitgets 来打印一个字节的8个位。

这个类还使用了一些正则表达式技巧,以确保解析的字符串具有所请求的精确表示:8个bitgets后跟一个空格或输入的结束。

import static java.nio.charset.StandardCharsets.US_ASCII;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class S2B2S {

    public S2B2S() {

    }

    public void toBitgets(StringBuilder sb, byte b) {
        for (int i = 0; i < Byte.SIZE; i++) {
            sb.append('0' + ((b >> (Byte.SIZE - i - 1))) & 1);
        }
    }

    public String encode(String s) {
        byte[] sdata = s.getBytes(US_ASCII);
        StringBuilder sb = new StringBuilder(sdata.length * (Byte.SIZE + 1));
        for (int i = 0; i < sdata.length; i++) {
            if (i != 0) {
                sb.append(' ');
            }
            byte b = sdata[i];
            toBitgets(sb, b);
        }
        return sb.toString();
    }

    public String decode(String bs) {
        byte[] sdata = new byte[(bs.length() + 1) / (Byte.SIZE + 1)];
        Pattern bytegets = Pattern.compile("([01]{8})(?: |$)");
        Matcher bytegetsFinder = bytegets.matcher(bs);
        int offset = 0, i = 0;
        while (bytegetsFinder.find()) {
            if (bytegetsFinder.start() != offset) {
                throw new IllegalArgumentException();
            }
            sdata[i++] = (byte) Integer.parseInt(bytegetsFinder.group(1), 2);

            offset = bytegetsFinder.end();
        }
        if (offset != bs.length()) {
            throw new IllegalArgumentException();
        }
        return new String(sdata, US_ASCII);
    }

    public static void main(String[] args) {
        String hello = "Hello";
        S2B2S s2b2s = new S2B2S();
        String encoded = s2b2s.encode(hello);
        System.out.println(encoded);
        String decoded = s2b2s.decode(encoded);
        System.out.println(decoded);
    }
}

只需要一次调试运行,我越来越擅长了 :) - Maarten Bodewes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接