【问题标题】:Extracting data from an unknown encoding file从未知编码文件中提取数据
【发布时间】:2018-07-10 09:43:52
【问题描述】:

我们使用由 MS DOS 提供支持的测试设备(1995 年制造)。模数转换器在文件中记录信息。 在 [picture1] 中显示了该文件的结构。 在 [picture2] 中显示了根据文件中的数据构建的波形图(用于在 MS DOS 上打开文件的程序)。 下面我放置了这个文件的链接(谷歌驱动器)。

这个文件包含了我需要的数据——海量的波形图点。我希望有机会在 Windows 或 Linux(不是 MS DOS)上保存、分析和打印此图表。所以我需要从文件中提取数据。

但我做不到。并且没有程序(我知道)不能打开这个文件。我分析了几个第一个字节,它们指向程序“TRAS v4.99”。这个程序在 MS DOS 上。

但我真的希望,真的是不用这个程序来获取数据。

附:如果有人会说这是不可能的——那也很好,因为我还没有找到观点:)

感谢您的宝贵时间!最好的问候!

LINK TO FILE ON GOOGLE DISK - 00014380.K00

文件结构

在 MS DOS 中通过程序打开文件

【问题讨论】:

    标签: arrays file encoding dos encode


    【解决方案1】:

    这里有一个关于如何解决这个问题的想法。由于手册中对格式进行了相对较好的指定,因此您可以使用 Java 编程语言,例如使用 java.io.RandomAccessFile 之类的东西来读取字节数组。然后可以根据数据类型将这些字节数组转换为 Java 原始类型或字符串。完成此转换后,您可以以人类可读的格式打印出数据。

    您可以在下面找到一些示例代码,让您了解使用这种方法可以做什么(我没有测试过代码,它不完整,只是让您了解可以做什么) :

    public static void readBinaryfile() throws IOException {
        java.io.RandomAccessFile randomAccessFile = new RandomAccessFile("test.bin", "r");
        byte[] addKenStrBytes = new byte[12];
        randomAccessFile.read(addKenStrBytes);
        String addKenStr = new String(addKenStrBytes, "UTF-8");
        // TODO: Do something with addKenStr.
        System.out.println(addKenStr);
    
        byte[] kopfSizeBytes = new byte[2];
        randomAccessFile.read(kopfSizeBytes);
        // TODO: Do something with kopfSizeBytes
        System.out.println(convertToInt(kopfSizeBytes));
    
        byte[] addRufNrCounterBytes = new byte[6];
        randomAccessFile.read(addRufNrCounterBytes);
        long addRufNrCounter = convertToLong(addRufNrCounterBytes);
        // TODO: Do something with addRufNrCounter
        System.out.println(addRufNrCounter);
    
        byte[] endAdrBytes = new byte[4];
        randomAccessFile.read(endAdrBytes);
        // TODO: Do something with endAdrBytes
        System.out.println(convertToLong(endAdrBytes));
    
        // Continue here and after you reached the end of the record repeat until you reached the end off the file
    }
    
    private static int convertToInt(byte[] bytes) {
        if(bytes.length > 4) {
            throw new IllegalArgumentException();
        }
        int buffer = 0;
        for(byte b : bytes) {
            buffer |= b;
            buffer = buffer << 8;
        }
        return buffer;
    }
    
    private static long convertToLong(byte[] bytes) {
        if(bytes.length > 8) {
            throw new IllegalArgumentException();
        }
        long buffer = 0L;
        for(byte b : bytes) {
            buffer |= b;
            buffer = buffer << 8;
        }
        return buffer;
    }
    

    请注意,超过 8 个字节的字段很可能需要转换为字符串。这不是完整的代码,只是一个示例,让您了解如何解决这个问题。

    【讨论】:

    • 哦,非常感谢。看来,我开始明白这一点了。之后我会写出结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 2021-04-29
    • 2014-07-19
    • 1970-01-01
    相关资源
    最近更新 更多