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

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

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

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





...全文
2509 点赞 收藏 9
写回复
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
顾染尘 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是一个地址,我要获取存储在这个地址里面的数据。 但是这边说二进制浮点数我就不太能理解,希望得到解答,谢谢啦!
回复
顾染尘 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审核通过就显示了
回复
冰思雨 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();
        }
    }
回复
冰思雨 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();
        }
    }
回复
顾染尘 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内存这一步骤,提高了效率,这里在代码中使用它,是为了提高程序的运行速度吗?还有其他作用吗?希望指点,谢谢啦!
回复
顾染尘 05-24
引用 3 楼 qybao 的回复:
不需要那么复杂,按4个字节4个字节读入文件,没读入一次做一次转换即可
可以把代码实现出来吗?可以的话可以换帖加分,我不懂,邪王能详细说明一下,谢谢啦!
回复
qybao 05-22
不需要那么复杂,按4个字节4个字节读入文件,没读入一次做一次转换即可
回复
顾染尘 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
回复
顾染尘 05-18
已解决:方案 使用c语言把dat文件转txt文件然后使用Java按行读取txt,将每8个字符串进行一次转换
回复
相关推荐
发帖
Java EE
创建于2007-09-28

6.6w+

社区成员

J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
申请成为版主
帖子事件
创建了帖子
2021-05-18 02:11
社区公告
暂无公告