1

ecg記録ファイルを読み取り、データを変数に書き込むプログラムを作成する必要があります。

私が今持っているのはinputstreamとだけですbytebuffer

ドキュメントから、最初の 2はunint16bytesを表し、次の 4は16 進数のマジック ナンバーなどを表す必要があることを知っています...checksumbytes

しかし、下のコードを実行すると、数値の出力が 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 に答える