gpt4 book ai didi

scala - 将 float 转换为 Big Endian

转载 作者:行者123 更新时间:2023-12-02 01:07:36 24 4
gpt4 key购买 nike

我有一个从文件中读取的 float 据。但我知道它是小端形式。为了理解它,我需要将它转换为 Big-endian。

我该怎么做?

这是我当前的代码:

  private def bilToArray(dataFile: Path, nRows: Integer, nCols: Integer): Array[Array[Float]] = {
val matrix = Array.ofDim[Float](nRows,nCols)
var file = new File(dataFile.toString)
var inputStream = new DataInputStream(new FileInputStream(file))

for(i <- 0 to nRows){
for(j <- 0 to nCols){
matrix(i)(j) = inputStream.readFloat() // need to convert to big endian
}
}

return matrix
}

最佳答案

Artavazd Balayan’s answer指向正确的方向。 ByteBuffer 允许将其内容解释为 Big Endian 或 Little Endian,如您所愿,是完成这项工作的正确工具。

但是当你使用它的时候,就不再需要DataInputStream了。您可以直接使用 ByteBuffer 进行传输。

有效处理它的 Java 代码可能如下所示:

static float[][] bilToArray(Path dataFile, int nRows, int nCols) throws IOException {
try(ReadableByteChannel fch = Files.newByteChannel(dataFile, StandardOpenOption.READ)){
float[][] matrix = new float[nRows][nCols];
ByteBuffer bb = ByteBuffer.allocateDirect(Float.BYTES*nRows*nCols);
while(bb.hasRemaining()) if(fch.read(bb)<0) throw new EOFException();
bb.flip();
FloatBuffer fb = bb.order(ByteOrder.LITTLE_ENDIAN).asFloatBuffer();
for(float[] row: matrix) fb.get(row);
return matrix;
}
}

如果文件非常大并且您知道它总是在默认文件系统中,您甚至可以使用 Memory-mapped file :

static float[][] bilToArray(Path dataFile, int nRows, int nCols) throws IOException {
try(FileChannel fch = FileChannel.open(dataFile, StandardOpenOption.READ)) {
float[][] matrix = new float[nRows][nCols];
ByteBuffer bb = fch.map(FileChannel.MapMode.READ_ONLY, 0, Float.BYTES*nRows*nCols);
FloatBuffer fb = bb.order(ByteOrder.LITTLE_ENDIAN).asFloatBuffer();
for(float[] row: matrix) fb.get(row);
return matrix;
}
}

将其转换为 Scala 应该不难。

关于scala - 将 float 转换为 Big Endian,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46870314/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com