fix: 改用小端字节序解析

dev
huangfeng 4 months ago
parent 4bd1c833d1
commit eb318677ab

@ -23,28 +23,24 @@ public class SouthYsp extends SpectrogramModel {
List<SouthYspChannel> channels = new ArrayList<>(); List<SouthYspChannel> channels = new ArrayList<>();
public void readFrom(DataInputStream dis) throws Exception { public void readFrom(DataInputStream dis) throws Exception {
version = dis.readFloat(); version = readLittleEndianFloat(dis);
fileVersion = dis.readFloat(); fileVersion = readLittleEndianFloat(dis);
type = dis.readShort(); type = readLittleEndianShort(dis);
createTime = dis.readLong(); createTime = readLittleEndianLong(dis);
flag = dis.read(); flag = dis.read();
StringBuilder sb = new StringBuilder(); name = readString(dis, 32);
for (int i = 0; i < 32; i++) { xInterval = readLittleEndianFloat(dis);
char c = (char) dis.readByte(); yMax = readLittleEndianFloat(dis);
sb.append(c);
}
name = sb.toString();
xInterval = dis.readFloat();
yMax = dis.readFloat();
xUnit = dis.read(); xUnit = dis.read();
yUnit = dis.read(); yUnit = dis.read();
k = dis.readInt(); k = readLittleEndianInt(dis);
m = dis.read(); m = dis.read();
for (int i = 0; i < m; i++) { for (int i = 0; i < m; i++) {
SouthYspChannel channel = new SouthYspChannel(); SouthYspChannel channel = new SouthYspChannel();
channel.readFrom(dis); channel.readFrom(dis);
channels.add(channel); channels.add(channel);
} }
dis.readInt();
for (SouthYspChannel channel : channels) { for (SouthYspChannel channel : channels) {
channel.readDataFrom(dis, k); channel.readDataFrom(dis, k);
} }

@ -6,6 +6,8 @@ import java.io.DataInputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import static com.xydl.cac.model.spectrogram.SpectrogramModel.readLittleEndianFloat;
@Data @Data
public class SouthYspChannel { public class SouthYspChannel {
Integer n; Integer n;
@ -23,7 +25,7 @@ public class SouthYspChannel {
public void readDataFrom(DataInputStream dis, Integer k) throws Exception { public void readDataFrom(DataInputStream dis, Integer k) throws Exception {
for (int i = 0; i < k; i++) { for (int i = 0; i < k; i++) {
Float v = dis.readFloat(); Float v = readLittleEndianFloat(dis);
data.add(v); data.add(v);
} }
} }

@ -2,6 +2,56 @@ package com.xydl.cac.model.spectrogram;
import lombok.Data; 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 @Data
public class SpectrogramModel { public class SpectrogramModel {
// 读取小端序的int4字节
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();
}
// 读取小端序的short2字节
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();
}
// 读取小端序的long8字节
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();
}
// 读取小端序的float4字节
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", "");
}
} }

@ -22,14 +22,14 @@ public class Ysp extends SpectrogramModel {
public void readFrom(DataInputStream dis) throws Exception { public void readFrom(DataInputStream dis) throws Exception {
code = dis.read(); code = dis.read();
length = dis.readInt(); length = readLittleEndianInt(dis);
createTime = dis.readLong(); createTime = readLittleEndianLong(dis);
flag = dis.read(); flag = dis.read();
xInterval = dis.readFloat(); xInterval = readLittleEndianFloat(dis);
yMax = dis.readFloat(); yMax = readLittleEndianFloat(dis);
xUnit = dis.read(); xUnit = dis.read();
yUnit = dis.read(); yUnit = dis.read();
k = dis.readInt(); k = readLittleEndianInt(dis);
m = dis.read(); m = dis.read();
for (int i = 0; i < m; i++) { for (int i = 0; i < m; i++) {
YspChannel channel = new YspChannel(); YspChannel channel = new YspChannel();

@ -6,6 +6,8 @@ import java.io.DataInputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import static com.xydl.cac.model.spectrogram.SpectrogramModel.readLittleEndianFloat;
@Data @Data
public class YspChannel { public class YspChannel {
Integer n; Integer n;
@ -20,7 +22,7 @@ public class YspChannel {
crests.add(crest); crests.add(crest);
} }
for (int i = 0; i < k; i++) { for (int i = 0; i < k; i++) {
Float v = dis.readFloat(); Float v = readLittleEndianFloat(dis);
data.add(v); data.add(v);
} }
} }

@ -4,6 +4,8 @@ import lombok.Data;
import java.io.DataInputStream; import java.io.DataInputStream;
import static com.xydl.cac.model.spectrogram.SpectrogramModel.*;
@Data @Data
public class YspChannelCrest { public class YspChannelCrest {
String name; String name;
@ -15,17 +17,12 @@ public class YspChannelCrest {
Float area; Float area;
public void readFrom(DataInputStream dis) throws Exception { public void readFrom(DataInputStream dis) throws Exception {
StringBuilder sb = new StringBuilder(); name = readString(dis, 10);
for (int i = 0; i < 10; i++) {
char c = (char) dis.readByte();
sb.append(c);
}
name = sb.toString();
j = dis.read(); j = dis.read();
time = dis.readFloat(); time = readLittleEndianFloat(dis);
startTime = dis.readFloat(); startTime = readLittleEndianFloat(dis);
endTime = dis.readFloat(); endTime = readLittleEndianFloat(dis);
height = dis.readFloat(); height = readLittleEndianFloat(dis);
area = dis.readFloat(); area = readLittleEndianFloat(dis);
} }
} }

Loading…
Cancel
Save