📕

ファイルが0と1でできていることを体感する

3 min read

体は食べたもので ファイルは0と1で できている

コンピュータ上のファイルは0と1の羅列であることを体感するため
バイナリファイルを16進数表現のテキストファイルに変換して
変換した16進数表現のテキストファイルからバイナリファイルに変換する
アスキーアートでもなんでもないが、コンピュータの世界は0と1だなぁと秋の夜長にコーヒー片手にニヤッとするのもたまにはよいかも。

Java11で書いてます。

バイナリファイルから16進数表現のテキストファイルに変換

package jp.co.dna_ltd;

import java.io.BufferedWriter;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;

public class HexStringFromBytes {

	public static void main(String[] args){

		String base = "D:\\basedir";

		//[入力用]バイナリファイル
		String inFilePath = base + "\\" + "data.7z";
		//[出力用]バイナリ文字列ファイル
		String outFilePath = base + "\\" + "data.txt";

		//[入力用]バイナリファイル 読込
		FileSystem fs = FileSystems.getDefault();
		Path inPath = fs.getPath(inFilePath);
		String data = "";
		try{
			byte[] bytes = Files.readAllBytes(inPath);
			data = toHexString(bytes);
		}catch(IOException e){
			e.printStackTrace();
		}

		//[出力用]バイナリ文字列ファイル 出力
		Path outPath = fs.getPath(outFilePath);
		// try-with-resourcesで書込ファイルを指定
		try(BufferedWriter bw = Files.newBufferedWriter(outPath, Charset.forName("UTF8"))){
			bw.write(data);
		}catch(IOException e){
			e.printStackTrace();
		}
	}

	public static String toHexString(byte[] src){
		StringBuilder buf = new StringBuilder();
		for(byte srcb: src){
			buf.append(String.format("%02X", srcb));
		}
		return buf.toString();
	}
}

16進数表現のテキストファイルからバイナリファイルに変換

package jp.co.dna_ltd;

import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Collectors;

import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.binary.Hex;

// commons-codec ライブラリ必要
public class HexStringToBytes {

	public static void main(String[] args) {
		
		String base = "D:\\basedir";
		String fileName = "data";
		
		byte[] byteData;
		String inFilePath = base + "\\" + fileName + ".txt";
		String outFilePath = base + "\\" + fileName + ".7z";

		try{
			String hexString = stringToBytes(inFilePath);
			byteData = Hex.decodeHex(hexString.toCharArray());
			FileOutputStream fileOutputStream = new FileOutputStream(outFilePath);
			fileOutputStream.write(byteData);
			fileOutputStream.flush();
			fileOutputStream.close();
		}catch(DecoderException e){
			e.printStackTrace();
		}catch(IOException e){
			e.printStackTrace();
		}
	}

	public static String stringToBytes(final String p) throws IOException{
		return Files.lines(Paths.get(p), Charset.forName("UTF-8"))
				.collect(Collectors.joining(System.getProperty("line.separator")));
	}
}

Discussion

ログインするとコメントできます