【问题标题】:Android ByteBuffer to float conversion return wrong valuesAndroid ByteBuffer 到浮点转换返回错误值
【发布时间】:2014-11-10 01:03:26
【问题描述】:

我正在尝试使用 RandomAccessFileFileChannel 读取包含大量浮点/整数值的 txt 文件,但在所有使用 ByteBuffer 的对话之后,我得到的值并不相同与txt文件中的那些。这是我的做法:

        RandomAccessFile mRandomFile = new RandomAccessFile(Environment.getExternalStorageDirectory() + "/Models/vertices.txt", "rw");
        FileChannel mInChannel = mRandomFile.getChannel();
        ByteBuffer mBuffer = ByteBuffer.allocate(181017 * 4);
        mBuffer.clear();

        mInChannel.read(mBuffer);

        mBuffer.rewind();
        FloatBuffer mFloatBUffer = mBuffer.asFloatBuffer();
        mFloatBUffer.get(VERTS);

        mInChannel.close();

        for (int i = 0; i < 20; i++) {
            Log.d("", "VALUE: " + VERTS[i]);
        }

txt 文件中的值以这种方式呈现(它们以新行分隔):

-36.122300
-6.356030
-46.876744
-36.122303
-7.448818
-46.876756
-36.122303
-7.448818
81.123221
-36.122300
-6.356030
81.123209
36.817676
-6.356030
-46.876779
36.817676
-7.448818
-46.876779
-36.122303
-7.448818

我在for 中得到的值是:

VALUE: 1.0187002E-11
VALUE: 2.5930944E-9
VALUE: 6.404289E-10
VALUE: 2.5957827E-6
VALUE: 2.6255839E-6
VALUE: 8.339467E-33
VALUE: 4.1885793E-11
VALUE: 1.0740952E-5
VALUE: 1.0187002E-11
VALUE: 2.5930944E-9
VALUE: 6.513428E-10
VALUE: 1.0383363E-5
VALUE: 4.3914857E-5
VALUE: 8.339467E-33
VALUE: 4.1885793E-11
VALUE: 1.0801023E-5
VALUE: 1.0187002E-11
VALUE: 2.5930944E-9
VALUE: 6.513428E-10
VALUE: 1.0383363E-5

任何想法,建议我在这里缺少什么?

【问题讨论】:

  • 它是一个文本文件,而不是一个充满二进制格式浮点数的文件。你为这项工作使用了错误的工具。
  • 好的,所以问题是,我应该如何创建这个带有浮点数的二进制文件?我已经看到了一些使用 txt 文件的 RandomAccessFile 示例,这就是我以这种方式尝试此选项的原因。

标签: java android bytebuffer


【解决方案1】:

这是一个文本文件,不是随机访问文件。您应该使用BufferedReader 阅读。它有一个返回字符串的readLine(),然后您可以使用Double.valueOf(String)

这里有更多代码How to use Buffered Reader in Java

【讨论】:

  • 我已经尝试过了,它可以工作,但它对我的需求来说太慢了。所以我想我应该创建另一个特定文件(随机访问)以便能够按原样获取数据,对吧?
  • 我不知道你想用它实现什么。如果您只想在文件中使用浮点数或双精度数,您应该使用 DataOutputStream docs.oracle.com/javase/7/docs/api/java/io/DataOutputStream.html 创建它并使用 DataInputStream 读取它比解析文本文件要快得多。如果您想在屏幕上绘制这些点,也许您应该使用一些开箱即用的解决方案,例如用于 2d gfx 的 SVG 或用于 3d 模型的 OBJ 或 3DS。
  • 我正在使用 Vuforia 来展示 3d 模型,这就是为什么我需要绘图点。 BufferedReader 和 DataOutputStream 太慢了,无法加载 12 个模型,每个模型都有 4 个文件,包含 200 000 个浮点/整数值。这就是我使用 FileChannel 的原因,它可以在不到一秒的时间内打开和读取 4 个文件。
【解决方案2】:

Android-Developer 再次,我看到你尝试二进制文件方法...要做到这一点,你必须转换你的数据

创建一个 new Java-Project 并使用您的原始方法从 xml/文本文件中加载值并将其转换为浮点数...(是的,这需要一些时间然后,但它提供了有效的数据......)一旦你的应用程序中的数据将你的浮点数存储到一个名为 floats.bin 的文件中(使用 FileWriter)。

然后将文件 floats.bin 复制到您的 Android 项目中,并尝试使用上面的代码将其加载到那里(我认为看起来不错)...

(指Android fastest way of reading big arrays of variables) 在为你的问题睡了一晚之后,我想你可以

  • 在展示模型之前分散用户的注意力并加载数据...

  • 或者您可以在加载时显示模型 - 让用户看到您的进度并看到模型每秒钟都在增长......

  • 或者您可以将数据从粗到细拆分成单独的块,并首先加载粗略数据并显示它 - 然后将越来越精细的数据加载到后台,并将其逐个添加到您的模型中。 .

【讨论】:

  • 问题是模型不会被呈现给用户,只有当他扫描一个唯一的图像标记,它将加载正确的模型。因此,如果用户在标记前面并打开应用程序,他必须等待很长时间才能加载所有模型,因为扫描 - 显示模型应该是非常快的过程......不超过一秒钟。
  • 好的,那么你真的必须在展示之前加载模型......我不想在提出这些建议时不礼貌,抱歉......但也许我对这两个项目的提示可以帮助你出来一点...
  • 我将尝试发布更新结果,感谢您的建议!
  • 很高兴看到您的进步!我真的祝你好运和成功!!!
  • 我现在只有一个问题...您是否考虑过存储整个 3d 模型而不是该模型的所有点?
猜你喜欢
  • 2019-09-10
  • 1970-01-01
  • 1970-01-01
  • 2022-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多