对于这个解决方案,我使用 Gson() (you can the jar or the maven dependencies from here) 来生成最终字符串,如您的示例所示。
我还创建了几个帮助类,您可以将它们放在项目的其他位置(不一定是内部类)。
main方法只是提供运行代码的手段。
输出如下:
已编辑我
每个浮动一个 b64 项目的原始解决方案。
{"instances":[{"b64":"QUczMw=="},{"b64":"QgpmZg=="},{"b64":"wgHS8g=="},{"b64":"QU+uFA=="}]}
代码:
public class FloatEncoder {
public static void main(String args[]) {
FloatEncoder encoder = new FloatEncoder();
float [] floats = new float[] {12.45f, 34.6f, -32.456f, 12.98f};
String encodedJson = encoder.encode(floats);
System.out.println(encodedJson);
}
private String encode(float[] floats) {
String rtn;
DataHolder holder = new DataHolder();
String [] audios = convertToBase64Bytes(floats);
for(String audio : audios) {
B64 b64 = new B64();
b64.b64 = audio;
holder.instances.add(b64);
}
Gson gson = new GsonBuilder().disableHtmlEscaping().create();
rtn = gson.toJson(holder);
return rtn;
}
public static String[] convertToBase64Bytes(float[] audio) {
String[] data = new String[audio.length];
for (int i = 0; i < audio.length; i++) {
float amplitude = audio[i];
byte[] byteArray = ByteBuffer.allocate(4).putFloat(amplitude).array();
data[i] = Base64.getEncoder().encodeToString(byteArray);
}
return data;
}
public static class DataHolder{
public ArrayList<B64> instances = new ArrayList<>();
}
public static class B64{
public String b64;
}
}
编辑二
一个 b64 项目的解决方案,其中浮点数数组编码为单个
字符串。
{"instances":[{"b64":"QUczM0IKZmbCAdLyQU+uFA=="}]}
字符串是字节数组的 Base64 编码,其中前 4 个字节是第一个浮点数,后 4 个字节是第二个浮点数,依此类推。
public class FloatEncoder {
public static void main(String args[]) {
FloatEncoder encoder = new FloatEncoder();
float [] floats = new float[] {12.45f, 34.6f, -32.456f, 12.98f};
String encodedJson = encoder.encode(floats);
System.out.println(encodedJson);
}
private String encode(float[] floats) {
String rtn;
DataHolder holder = new DataHolder();
String audios = convertToBase64Bytes(floats);
B64 b64 = new B64();
b64.b64 = audios;
holder.instances.add(b64);
Gson gson = new GsonBuilder().disableHtmlEscaping().create();
rtn = gson.toJson(holder);
return rtn;
}
public static String convertToBase64Bytes(float[] audio) {
ByteBuffer byteBuffer = ByteBuffer.allocate(4 * audio.length);
for (int i = 0; i < audio.length; i++) {
float amplitude = audio[i];
byteBuffer.putFloat(amplitude);
}
byte[] data = byteBuffer.array();
String rtn = Base64.getEncoder().encodeToString(data);
return rtn;
}
public static class DataHolder{
public ArrayList<B64> instances = new ArrayList<>();
}
public static class B64{
public String b64;
}
}