二进制文件转Hex和Wav文件转Hex的Java代码
二进制文件转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);
}
}
二进制文件转Hex和Wav文件转Hex的Java代码的更多相关文章
- 【Java学习day04】Java文件的创建和Java代码的执行
Java文件的创建和Java代码的执行 随便新建一个文件夹,存放代码 在新建的文件夹里新建一个java文件 新建一个文本文档 将新建的文本文档重命名为hello.java 注意了!后缀必须改为.jav ...
- Linux音频编程--使用ALSA库播放wav文件
在UBUNTU系统上使用alsa库完成了对外播放的wav文件的案例. 案例代码: /** *test.c * *注意:这个例子在Ubuntu 12.04.1环境下编译运行成功. * */ #inclu ...
- HEX和BIN文件的区别
以下的内容是从网上转载来的,原文地址:http://blog.csdn.net/zhangliang_571/article/details/8519469 在这里感谢原作者. 1,是在keil中编 ...
- 豹哥嵌入式讲堂:ARM Cortex-M开发之文件详解(8)- 镜像文件(.bin/.hex/.s19)
大家好,我是豹哥,猎豹的豹,犀利哥的哥.今天豹哥给大家讲的是嵌入式开发里的image文件(.bin, .hex, .s19). 今天这节课是豹哥<ARM Cortex-M开发之文件详解>主 ...
- 痞子衡嵌入式:ARM Cortex-M文件那些事(8)- 镜像文件(.bin/.hex/.s19)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是嵌入式开发里的image文件(.bin, .hex, .s19). 今天这节课是痞子衡<ARM Cortex-M文件那些事>主 ...
- hex转mif文件 verilog
用FPGA来跑ARM 核的时候,刚开始将Keil编译产生的hex文件拿来仿真和下到板子上的时候,发现程序运行不正确.细细观察仿真波形发现,在Altera的ROM IP中直接调用Keil产生的hex文件 ...
- C#读取wav文件
private void showWAVForm(string filepath) //此函数只能用于读取16bit量化单声道的WAV文件 { FileStream fs = new FileStre ...
- delphi 合并两个 Wav 文件流的函数
合并两个 Wav 文件的函数 实例一 unit Unit1; interface usesWindows, Messages, SysUtils, Variants, Classes, Graphic ...
- wav文件系列_1_wav格式解读
本文介绍 wav 文件格式,主要关注该类格式的结构. 参考: [1] 以一个wav文件为实例分析wav文件格式 ( 2017.04.11 CSDN ) [2] WAV ( Wikipedia ) [3 ...
- C++标准库实现WAV文件读写
在上一篇文章RIFF和WAVE音频文件格式中对WAV的文件格式做了介绍,本文将使用标准C++库实现对数据为PCM格式的WAV文件的读写操作,只使用标准C++库函数,不依赖于其他的库. WAV文件结构 ...
随机推荐
- Angular系列教程之依赖注入详解
.markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...
- Manjaro Linux永久修改主机名
技术背景 Linux系统中默认的主机名可以通过hostname指令进行查询,一般默认的是一串的随机字符串: [dechin@dechin-20n2s01200 numba]$ hostname dec ...
- 【MicroPython】 mp对象和 c 类型的转换
[来源]https://www.eemaker.com/micropython-mp-toc.html
- bootstrap : 响应式导航
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...
- 【转帖】eBay 云计算“网”事|网络重传篇
https://www.infoq.cn/article/iy1drmf6wk8up14dchq8/ #导读 在之前的eBay云计算"网"事|网络超时篇和eBay云计算" ...
- [转帖]Linux性能分析(二):理解CPU上下文切换
在计算机中,上下文切换是指存储进程或线程的状态,以便以后可以还原它并从同一点恢复执行.这允许多个进程共享一个CPU,这是多任务操作系统的基本功能. Linux 是一个多任务操作系统,它支持远大于 CP ...
- [转帖]Python基础之文件处理(二)
https://www.jianshu.com/p/7dd08066f499 Python基础文件处理 python系列文档都是基于python3 一.字符编码 在python2默认编码是ASCII, ...
- 【转帖】Docker容器四种网络模式
https://blog.whsir.com/post-5268.html docker自身默认提供了四种网络模式:none.bridge.container.host.除了这四种网络模式外,还可以通 ...
- VOP 消息仓库演进之路|如何设计一个亿级企业消息平台
作者:京东零售 李孟冬 VOP作为京东企业业务对外的API对接采购供应链解决方案平台,一直致力于从企业采购数字化领域出发,发挥京东数智化供应链能力,通过产业链上下游耦合与链接,有效助力企业客户的成本优 ...
- 设置echarts线的样式
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...