求助!!!!Java读取16进制文件问题

顾染尘 2021-05-18 02:11:04
现在有一个16进制文件如图

格式是每4组表示一个数,文件中数字存储形式是float类型,想要将里面的16进制数转化为10进制的float类型存储在一个txt或者ini文件中,请问要怎么实现?

进制是左低位右高位。
例如:BA 12 2A 43 读取的值为170.073151





...全文
22437 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
顾染尘 2021-05-25
  • 打赏
  • 举报
回复
引用 5 楼 冰思雨 的回复:
楼主使用这个代码,可以将小端模式的二进制浮点数转换成文本文件。 注意,输入和输出的文件名不要相同。

    public static void main(String[] args) throws IOException {
        
        try(FileInputStream  inStream  = new FileInputStream("path/to/inFile.data"); 
            FileOutputStream outStream = new FileOutputStream("path/to/outFile.txt"); 
            ReadableByteChannel inCh = inStream.getChannel(); 
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outStream));) {
            ByteBuffer buffer = ByteBuffer.allocateDirect(32 * 1024);
            buffer.order(ByteOrder.LITTLE_ENDIAN);
            
            while (inCh.read(buffer) >= 0) {
                if (buffer.position() < 3) {
                    Thread.yield();
                    continue;
                }
                buffer.flip();
                while (buffer.remaining() > 3) {
                    float number = buffer.getFloat();
                    writer.append(String.valueOf(number)).append(' ');
                }
                buffer.compact();
            }
            
            writer.flush();
        }
    }
关于说二进制浮点数这个可以把理解说一下吗?我现在对dat文件中的存储数据的理解就是打开文件需要使用UE打开,里面使用16进制显示的都是地址,也就是说BA 12 2A 43是一个地址,我要获取存储在这个地址里面的数据。 但是这边说二进制浮点数我就不太能理解,希望得到解答,谢谢啦!
顾染尘 2021-05-25
  • 打赏
  • 举报
回复
引用 5 楼 冰思雨 的回复:
楼主使用这个代码,可以将小端模式的二进制浮点数转换成文本文件。 注意,输入和输出的文件名不要相同。

    public static void main(String[] args) throws IOException {
        
        try(FileInputStream  inStream  = new FileInputStream("path/to/inFile.data"); 
            FileOutputStream outStream = new FileOutputStream("path/to/outFile.txt"); 
            ReadableByteChannel inCh = inStream.getChannel(); 
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outStream));) {
            ByteBuffer buffer = ByteBuffer.allocateDirect(32 * 1024);
            buffer.order(ByteOrder.LITTLE_ENDIAN);
            
            while (inCh.read(buffer) >= 0) {
                if (buffer.position() < 3) {
                    Thread.yield();
                    continue;
                }
                buffer.flip();
                while (buffer.remaining() > 3) {
                    float number = buffer.getFloat();
                    writer.append(String.valueOf(number)).append(' ');
                }
                buffer.compact();
            }
            
            writer.flush();
        }
    }
首先非常感谢您的解答,其次使用测试时显示try的部分有问题,去掉后成功运行 (每个方法后面要是有实现的功能就好了,因为除了append这个方法其他都没用过,自己一个个查的),然后 换帖加分来https://bbs.csdn.net/topics/399173986审核通过就显示了
冰思雨 2021-05-25
  • 打赏
  • 举报
回复
忽略全是0的数据。
    public static void main(String[] args) throws IOException {

        try(FileInputStream  inStream  = new FileInputStream("path/to/inFile.data");
            FileOutputStream outStream = new FileOutputStream("path/to/outFile.txt");
            ReadableByteChannel inCh = inStream.getChannel();
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outStream));) {
            ByteBuffer buffer = ByteBuffer.allocateDirect(32 * 1024);
            buffer.order(ByteOrder.LITTLE_ENDIAN);

            while (inCh.read(buffer) >= 0) {
                if (buffer.position() < 7) {
                    Thread.yield();
                    continue;
                }
                buffer.flip();
                while (buffer.remaining() > 7) {
                    buffer.getInt();
                    float number = buffer.getFloat();
                    writer.append(String.valueOf(number)).append(' ');
                }
                buffer.compact();
            }

            writer.flush();
        }
    }
冰思雨 2021-05-25
  • 打赏
  • 举报
回复
楼主使用这个代码,可以将小端模式的二进制浮点数转换成文本文件。 注意,输入和输出的文件名不要相同。

    public static void main(String[] args) throws IOException {
        
        try(FileInputStream  inStream  = new FileInputStream("path/to/inFile.data"); 
            FileOutputStream outStream = new FileOutputStream("path/to/outFile.txt"); 
            ReadableByteChannel inCh = inStream.getChannel(); 
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outStream));) {
            ByteBuffer buffer = ByteBuffer.allocateDirect(32 * 1024);
            buffer.order(ByteOrder.LITTLE_ENDIAN);
            
            while (inCh.read(buffer) >= 0) {
                if (buffer.position() < 3) {
                    Thread.yield();
                    continue;
                }
                buffer.flip();
                while (buffer.remaining() > 3) {
                    float number = buffer.getFloat();
                    writer.append(String.valueOf(number)).append(' ');
                }
                buffer.compact();
            }
            
            writer.flush();
        }
    }
顾染尘 2021-05-25
  • 打赏
  • 举报
回复
引用 5 楼 冰思雨 的回复:
楼主使用这个代码,可以将小端模式的二进制浮点数转换成文本文件。 注意,输入和输出的文件名不要相同。

    public static void main(String[] args) throws IOException {
        
        try(FileInputStream  inStream  = new FileInputStream("path/to/inFile.data"); 
            FileOutputStream outStream = new FileOutputStream("path/to/outFile.txt"); 
            ReadableByteChannel inCh = inStream.getChannel(); 
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outStream));) {
            ByteBuffer buffer = ByteBuffer.allocateDirect(32 * 1024);
            buffer.order(ByteOrder.LITTLE_ENDIAN);
            
            while (inCh.read(buffer) >= 0) {
                if (buffer.position() < 3) {
                    Thread.yield();
                    continue;
                }
                buffer.flip();
                while (buffer.remaining() > 3) {
                    float number = buffer.getFloat();
                    writer.append(String.valueOf(number)).append(' ');
                }
                buffer.compact();
            }
            
            writer.flush();
        }
    }
对于“ByteBuffer.allocateDirect(32 * 1024)”的理解在网上查了一下,但是并没有更多的信息,大多数都是说allocateDirect是省略了从系统内存复制到jvn内存这一步骤,提高了效率,这里在代码中使用它,是为了提高程序的运行速度吗?还有其他作用吗?希望指点,谢谢啦!
顾染尘 2021-05-24
  • 打赏
  • 举报
回复
引用 3 楼 qybao 的回复:
不需要那么复杂,按4个字节4个字节读入文件,没读入一次做一次转换即可
可以把代码实现出来吗?可以的话可以换帖加分,我不懂,邪王能详细说明一下,谢谢啦!
qybao 2021-05-22
  • 打赏
  • 举报
回复
不需要那么复杂,按4个字节4个字节读入文件,没读入一次做一次转换即可
顾染尘 2021-05-19
  • 打赏
  • 举报
回复
解决链接: Java实现将16进制转10进制浮点型输出到文件中: https://blog.csdn.net/weixin_43917334/article/details/117033747 c语言16进制转txt可读文件: https://blog.csdn.net/weixin_43917334/article/details/117033192
顾染尘 2021-05-18
  • 打赏
  • 举报
回复 1
已解决:方案 使用c语言把dat文件转txt文件然后使用Java按行读取txt,将每8个字符串进行一次转换

67,550

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧