fix: 改用小端字节序解析

dev
huangfeng 4 months ago
parent 4bd1c833d1
commit eb318677ab

@ -23,28 +23,24 @@ public class SouthYsp extends SpectrogramModel {
List<SouthYspChannel> 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);
}

@ -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);
}
}

@ -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 {
// 读取小端序的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 {
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();

@ -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);
}
}

@ -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);
}
}

Loading…
Cancel
Save