diff --git a/src/main/java/com/xydl/cac/model/spectrogram/SouthYsp.java b/src/main/java/com/xydl/cac/model/spectrogram/SouthYsp.java index 0018ff5..0b6e0ae 100644 --- a/src/main/java/com/xydl/cac/model/spectrogram/SouthYsp.java +++ b/src/main/java/com/xydl/cac/model/spectrogram/SouthYsp.java @@ -23,28 +23,24 @@ public class SouthYsp extends SpectrogramModel { List channels = new ArrayList<>(); public void readFrom(DataInputStream dis) throws Exception { - version = dis.readFloat(); - fileVersion = dis.readFloat(); - type = dis.readShort(); - createTime = dis.readLong(); + version = readLittleEndianFloat(dis); + fileVersion = readLittleEndianFloat(dis); + type = readLittleEndianShort(dis); + createTime = readLittleEndianLong(dis); flag = dis.read(); - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < 32; i++) { - char c = (char) dis.readByte(); - sb.append(c); - } - name = sb.toString(); - xInterval = dis.readFloat(); - yMax = dis.readFloat(); + name = readString(dis, 32); + xInterval = readLittleEndianFloat(dis); + yMax = readLittleEndianFloat(dis); xUnit = dis.read(); yUnit = dis.read(); - k = dis.readInt(); + k = readLittleEndianInt(dis); m = dis.read(); for (int i = 0; i < m; i++) { SouthYspChannel channel = new SouthYspChannel(); channel.readFrom(dis); channels.add(channel); } + dis.readInt(); for (SouthYspChannel channel : channels) { channel.readDataFrom(dis, k); } diff --git a/src/main/java/com/xydl/cac/model/spectrogram/SouthYspChannel.java b/src/main/java/com/xydl/cac/model/spectrogram/SouthYspChannel.java index 06b09b1..f2a5174 100644 --- a/src/main/java/com/xydl/cac/model/spectrogram/SouthYspChannel.java +++ b/src/main/java/com/xydl/cac/model/spectrogram/SouthYspChannel.java @@ -6,6 +6,8 @@ import java.io.DataInputStream; import java.util.ArrayList; import java.util.List; +import static com.xydl.cac.model.spectrogram.SpectrogramModel.readLittleEndianFloat; + @Data public class SouthYspChannel { Integer n; @@ -23,7 +25,7 @@ public class SouthYspChannel { public void readDataFrom(DataInputStream dis, Integer k) throws Exception { for (int i = 0; i < k; i++) { - Float v = dis.readFloat(); + Float v = readLittleEndianFloat(dis); data.add(v); } } diff --git a/src/main/java/com/xydl/cac/model/spectrogram/SpectrogramModel.java b/src/main/java/com/xydl/cac/model/spectrogram/SpectrogramModel.java index 2b861d7..1e09fba 100644 --- a/src/main/java/com/xydl/cac/model/spectrogram/SpectrogramModel.java +++ b/src/main/java/com/xydl/cac/model/spectrogram/SpectrogramModel.java @@ -2,6 +2,56 @@ package com.xydl.cac.model.spectrogram; import lombok.Data; +import java.io.DataInputStream; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.charset.StandardCharsets; + @Data public class SpectrogramModel { + + // 读取小端序的int(4字节) + public static int readLittleEndianInt(DataInputStream dis) throws IOException { + byte[] bytes = new byte[4]; + dis.readFully(bytes); + return ByteBuffer.wrap(bytes) + .order(ByteOrder.LITTLE_ENDIAN) + .getInt(); + } + + // 读取小端序的short(2字节) + public static short readLittleEndianShort(DataInputStream dis) throws IOException { + byte[] bytes = new byte[2]; + dis.readFully(bytes); + return ByteBuffer.wrap(bytes) + .order(ByteOrder.LITTLE_ENDIAN) + .getShort(); + } + + // 读取小端序的long(8字节) + public static long readLittleEndianLong(DataInputStream dis) throws IOException { + byte[] bytes = new byte[8]; + dis.readFully(bytes); + return ByteBuffer.wrap(bytes) + .order(ByteOrder.LITTLE_ENDIAN) + .getLong(); + } + + // 读取小端序的float(4字节) + public static float readLittleEndianFloat(DataInputStream dis) throws IOException { + byte[] bytes = new byte[4]; + dis.readFully(bytes); + return ByteBuffer.wrap(bytes) + .order(ByteOrder.LITTLE_ENDIAN) + .getFloat(); + } + + // 读取String + public static String readString(DataInputStream dis, int length) throws IOException { + byte[] bytes = new byte[length]; + dis.readFully(bytes); + String str = new String(bytes, StandardCharsets.UTF_8); + return str.replaceAll("\\u0000", ""); + } } diff --git a/src/main/java/com/xydl/cac/model/spectrogram/Ysp.java b/src/main/java/com/xydl/cac/model/spectrogram/Ysp.java index 63fc00d..2d168ab 100644 --- a/src/main/java/com/xydl/cac/model/spectrogram/Ysp.java +++ b/src/main/java/com/xydl/cac/model/spectrogram/Ysp.java @@ -22,14 +22,14 @@ public class Ysp extends SpectrogramModel { public void readFrom(DataInputStream dis) throws Exception { code = dis.read(); - length = dis.readInt(); - createTime = dis.readLong(); + length = readLittleEndianInt(dis); + createTime = readLittleEndianLong(dis); flag = dis.read(); - xInterval = dis.readFloat(); - yMax = dis.readFloat(); + xInterval = readLittleEndianFloat(dis); + yMax = readLittleEndianFloat(dis); xUnit = dis.read(); yUnit = dis.read(); - k = dis.readInt(); + k = readLittleEndianInt(dis); m = dis.read(); for (int i = 0; i < m; i++) { YspChannel channel = new YspChannel(); diff --git a/src/main/java/com/xydl/cac/model/spectrogram/YspChannel.java b/src/main/java/com/xydl/cac/model/spectrogram/YspChannel.java index cd4512c..c73a52e 100644 --- a/src/main/java/com/xydl/cac/model/spectrogram/YspChannel.java +++ b/src/main/java/com/xydl/cac/model/spectrogram/YspChannel.java @@ -6,6 +6,8 @@ import java.io.DataInputStream; import java.util.ArrayList; import java.util.List; +import static com.xydl.cac.model.spectrogram.SpectrogramModel.readLittleEndianFloat; + @Data public class YspChannel { Integer n; @@ -20,7 +22,7 @@ public class YspChannel { crests.add(crest); } for (int i = 0; i < k; i++) { - Float v = dis.readFloat(); + Float v = readLittleEndianFloat(dis); data.add(v); } } diff --git a/src/main/java/com/xydl/cac/model/spectrogram/YspChannelCrest.java b/src/main/java/com/xydl/cac/model/spectrogram/YspChannelCrest.java index b4524f5..d167bbc 100644 --- a/src/main/java/com/xydl/cac/model/spectrogram/YspChannelCrest.java +++ b/src/main/java/com/xydl/cac/model/spectrogram/YspChannelCrest.java @@ -4,6 +4,8 @@ import lombok.Data; import java.io.DataInputStream; +import static com.xydl.cac.model.spectrogram.SpectrogramModel.*; + @Data public class YspChannelCrest { String name; @@ -15,17 +17,12 @@ public class YspChannelCrest { Float area; public void readFrom(DataInputStream dis) throws Exception { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < 10; i++) { - char c = (char) dis.readByte(); - sb.append(c); - } - name = sb.toString(); + name = readString(dis, 10); j = dis.read(); - time = dis.readFloat(); - startTime = dis.readFloat(); - endTime = dis.readFloat(); - height = dis.readFloat(); - area = dis.readFloat(); + time = readLittleEndianFloat(dis); + startTime = readLittleEndianFloat(dis); + endTime = readLittleEndianFloat(dis); + height = readLittleEndianFloat(dis); + area = readLittleEndianFloat(dis); } }