首页 > 编程语言 >二进制文件转Hex和Wav文件转Hex的Java代码

二进制文件转Hex和Wav文件转Hex的Java代码

时间:2022-12-18 17:23:43浏览次数:39  
标签:文件 Java String int bytes Hex width sb path

二进制文件转Hex

对于需要将二进制数据写入固件的场景(例如mp3文件), 需要将二进制文件表示为byte数组

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;


public class RawConverter {
	public static final int LINE_LIMIT = 20;

	private final String path;
	private final int width;
	private final boolean littleEnd;

	public RawConverter(String path, int width, boolean littleEnd) {
		this.path = path;
		this.width = width;
		this.littleEnd = littleEnd;
	}

	public static byte[] readBytes(File file)
	{
		try (FileInputStream fl = new FileInputStream(file)) {
			byte[] arr = new byte[(int)file.length()];
			fl.read(arr);
			return arr;
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		}
	}

	public String convert() {
		File file = new File(this.path);
		if (file.exists()) {
			byte[] bytes = readBytes(file);
			StringBuilder sb = new StringBuilder();

			byte[][] units = new byte[bytes.length/width][width];
			for (int i = 0; i < bytes.length; i++) {
				int pos = i / width;
				int shift = i % width;
				if (littleEnd) {
					units[pos][width - 1 - shift] = bytes[i];
				} else {
					units[pos][shift] = bytes[i];
				}
			}
			int count = 0;
			for (int i = 0; i < units.length; i++) {
				sb.append("0x");
				for (int j = 0; j < width; j++) {
					sb.append(String.format("%02x", units[i][j]));
				}
				if (i < units.length - 1) {
					sb.append(", ");
				}
				count++;
				if (count % LINE_LIMIT == 0) {
					sb.append("\n");
					count = 0;
				}
			}

			return String.format("Samples: %d\n\n%s\n",
					bytes.length / width,
					sb);
		}
		return null;
	}

	public static void main(String[] args) {
		String path = "/home/user/Song-4-clip4.mp3";
		String output = new RawConverter(path, 1, true).convert();
		System.out.println(output);
	}
}

Wav文件转Hex

import org.apache.commons.io.IOUtils;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import java.net.URL;
import java.nio.file.Path;
import java.nio.file.Paths;


public class Converter {
	public static final int LINE_LIMIT = 20;

	private final String path;
	private final int width;

	public Converter(String path, int width) {
		this.path = path;
		this.width = width;
	}

	public String convert() {
		try {
			final Path path = Paths.get(this.path);
			final URL url = path.toUri().toURL();
			final AudioInputStream ais = AudioSystem.getAudioInputStream(url);
			final AudioFormat format = ais.getFormat();

			byte[] bytes = IOUtils.toByteArray(ais);
			StringBuilder sb = new StringBuilder();
			int wc = 0, count = 0;
			for (int i = 0; i < bytes.length; i++) {
				if (wc == 0) {
					sb.append("0x");
				}
				sb.append(String.format("%02x", bytes[i]));
				wc++;
				if (wc % width == 0 && i < bytes.length - 1) {
					sb.append(", ");
					wc = 0;
					count++;
				}
				if (wc == 0 && count % LINE_LIMIT == 0) {
					sb.append("\n");
					count = 0;
				}
			}

			return String.format("Sample rate: %.2f Hz\nSample width: %d bits\nChannels: %d\nSamples: %d\n\n%s\n",
					format.getSampleRate(),
					format.getSampleSizeInBits(),
					format.getChannels(),
					bytes.length / width,
					sb);

		} catch (Throwable t) {
			throw new RuntimeException(t);
		}
	}

	public static void main(String[] args) {
		String path = "/home/user/627b.wav";
		String output = new Converter(path, 2).convert();
		System.out.println(output);
	}
}

标签:文件,Java,String,int,bytes,Hex,width,sb,path
From: https://www.cnblogs.com/milton/p/16990597.html

相关文章

  • 27_Java中的方法引用
    Java中的方法引用​ 方法引用是在Lambda的基础进行的,本质是将Lambda中的参数列表传递给我们使用了的方法引用中的方法。(这样在使用一些本就存在的方法完成函数式编......
  • 拼接合并PDF文件
    工具:python,PyPDF2安装PyPDF2:pipinstallPyPDF2待合并文件:合并代码:fromPyPDF2importPdfMergermerger=PdfMerger()#将文件名放入列表files=[(st......
  • Java核心实操:内存溢出 实战、内存泄漏实战
    文章很长,而且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面......
  • JAVA流程控制
    JAVA流程控制Scanner对象java.util.Scanner是JDK5新特征,我们可以通过Scanner类来获取用户的输入next():一定要读取到有效字符后才可以结束输入对输入有效字符之......
  • javaScript随机图片
    <scripttype="text/javascript">//<!CDATA[varpic=[];pic[0]="链接";pic[1]="链接";pic[2]="链接";pic[3]="链接";varr......
  • 可执行文件的装载与进程
    装载的两种方式:曾经使用的覆盖装入,现在使用的页映射,都是动态装入,覆盖装入:将模块按照它们之间的依赖关系组织成树状结构。本质上还是想节约内存,将没有依赖的模块可以覆盖在......
  • Java中for语句的加强版
    语法格式://语法格式for(声明语句:表达式){ //代码句子}声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块,其值与此时数......
  • 你的项目使用的是哪种配置文件?
    1.开发环境JDK版本:17.0.3IDEA版本:2022.1.4Maven版本:3.8.6SpringBoot版本:3.0.0 2.application.properties配置文件2.1创建Module模块创建spring-boot-prope......
  • Java递归查找文件位置
     packagecn.edu.lcudcc;importjava.io.File;publicclassRecursionDemo{publicstaticvoidmain(String[]args){//传入目录和文件s......
  • ajax 提交文件
    html页面:<formid="uploadForm"method="post"enctype="multipart/form-data"><label>选择文件</label><inputid="file"type="file"name="fil......