1

我必须编写一个程序来读取ecg记录文件并将数据写入变量。

我现在只有inputstreamand a bytebuffer

我从文档中知道,前 2bytes应该代表checksumunint16 接下来的 4bytes应该以十六进制给出一个幻依此类推......

但是,如果我执行下面的代码,它将无法工作,因为数字的输出是 0。

我的问题是我是否在缓冲区部分做错了什么。这很奇怪,因为如果我将整个流写入一个数组,然后指向 3 - 6 元素的位置,则输出将是:

output += String.format("0x%02X", bC[2]);然后我把它倒过来读我得到了神奇的数字。

public class Stream {
private String fileName;
private byte[] storageArray;
private int byteLength;
private byte[] magicNumber;



public Stream(String fileName) {
    this.fileName = fileName;
    try {
        readIt();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}



public void readIt() throws IOException {

    FileInputStream fileIn = new FileInputStream("ecg-file");

            //for skipping to the desired beginning of the byte stream

    fileIn.skip(0);
    setByteLength(fileIn.available());
    storageArray = new byte[getByteLength()];
    fileIn.read(getStorageArray());
    fileIn.close();
}


public String getCRCNumber () {
    ByteBuffer twoByte = ByteBuffer.wrap(getStorageArray());
    twoByte.order(ByteOrder.LITTLE_ENDIAN);

            //the missing bytes @ the beginning for the int
    twoByte.put((byte)0x00);
    twoByte.put((byte)0x00);
            //shift the start position per 2 bytes 
           // and read the first 2 bytes of the inputstream into the buffer 
    twoByte.position(0x02);
    twoByte.put(getStorageArray(), 0, 2);
    twoByte.flip();
            //creates the int number of the 4 bytes in the buffer
    int result = twoByte.getInt();


    String output = "";
    String b = "\n";


    return output += Integer.toString(result);


}


public int getByteLength() {
    return byteLength;
}

public void setByteLength(int byteLength) {
    this.byteLength = byteLength;
}

public String getFileName() {
    return fileName;
}

public void setFileName(String fileName) {
    this.fileName = fileName;
}

public byte[] getMagicNumber() {
    return magicNumber;
}

public void setMagicNumber(byte[] magicNumber) {
    this.magicNumber = magicNumber;
}

public byte[] getStorageArray() {
    return storageArray;
}

public void setStorageArray(byte[] storageArray) {
    this.storageArray = storageArray;
}

}

4

1 回答 1

1

你的第一个问题是使用available()。它所做的只是告诉您在没有阻塞的情况下可以读取多少数据,这很少引起人们的兴趣,并且 Javadoc 中有一个特定的警告,反对将其视为整个输入的长度。您真正感兴趣的是您需要多少数据。

幸运的是,有一个简单的解决方案。将输入流包装在 a 中DataInputStream,并读取如下:

short crc16 = in.readShort();
// check the CRC
String hexString = "0x"+(Integer.toString(in.readInt(), 16));
// ...

等等。请参阅 Javadoc。

skip(0)在您的代码中不执行任何操作,因为这是您打开文件时已经在的位置。

我不知道你说的“倒过来读”是什么意思。

于 2013-10-04T01:30:47.843 回答