diff --git a/setup.py b/setup.py index a45a27d..868245a 100644 --- a/setup.py +++ b/setup.py @@ -6,7 +6,7 @@ from pybind11 import get_cmake_dir from pybind11.setup_helpers import Pybind11Extension, build_ext from setuptools import setup -__version__ = "0.1.2" +__version__ = "0.1.3" ext_modules = [ Pybind11Extension( diff --git a/src/main.cpp b/src/main.cpp index 1c33a49..683fa43 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3,9 +3,14 @@ #include #include #include +#include #include #include #include "stormpci.h" +#include "string.h" + +namespace py = pybind11; + #define STRINGIFY(x) #x #define MACRO_STRINGIFY(x) STRINGIFY(x) @@ -43,10 +48,12 @@ double distance(double lat1, double lon1, double lat2, double lon2) class BlockReader { public: - BlockReader(const std::string &fn){ + BlockReader(const std::string &fn, long int seek_position){ f = std::ifstream(fn, std::fstream::binary); + pos = seek_position; } BlockBinary& read_block(){ + f.seekg(pos); f.read(reinterpret_cast(&_single_block), sizeof(BlockBinary)); if (not f){ throw; @@ -56,13 +63,16 @@ public: return _single_block; } std::vector& read_all_blocks(){ + f.seekg(pos); bool read_successfully = true; while (read_successfully){ f.read(reinterpret_cast(&_single_block), sizeof(BlockBinary)); - if (not f){ + if (f) { + _blocks_vector.push_back(_single_block); + pos += sizeof(BlockBinary); + } else { read_successfully = false; } - _blocks_vector.push_back(_single_block); } return _blocks_vector; } @@ -76,7 +86,6 @@ private: std::vector _blocks_vector; }; -namespace py = pybind11; PYBIND11_MODULE(stormpci_bin_reader, m) { m.doc() = R"pbdoc( @@ -92,7 +101,7 @@ PYBIND11_MODULE(stormpci_bin_reader, m) { py::class_(m, "BlockReader") - .def(py::init()) + .def(py::init(), py::arg("fn"), py::arg("seek")=int(0)) .def("read_block", &BlockReader::read_block) .def("read_all_blocks", &BlockReader::read_all_blocks); @@ -100,6 +109,9 @@ PYBIND11_MODULE(stormpci_bin_reader, m) { .def_readonly("strike", &BlockBinary::strike) .def_readonly("device_id", &BlockBinary::device_id) .def_readonly("experiment_id", &BlockBinary::experiment_id) + .def_property_readonly("raw_data", [](const BlockBinary bb) { + return py::bytes(reinterpret_cast(&bb), sizeof(bb)); + }) .def("__repr__", [](const BlockBinary &bb) { std::stringstream stream; diff --git a/tests/test.bin b/tests/test.bin new file mode 100644 index 0000000..9afba22 Binary files /dev/null and b/tests/test.bin differ diff --git a/tests/test.py b/tests/test.py index 09c81a5..12e8d3b 100644 --- a/tests/test.py +++ b/tests/test.py @@ -1,7 +1,18 @@ from stormpci_bin_reader import BlockReader -br = BlockReader("2022-04-23-00:00:37.bin") +br = BlockReader("2022-04-23-00:00:37.bin", seek=0) blocks = br.read_all_blocks() -for block in blocks: +# print(len(blocks)) + +for j, block in enumerate(blocks): + if j == 0: + # print(len(block.raw_data)) + with open("test.bin", "wb") as f: + f.write(block.raw_data) print(block) + +# for tests run in bash: +# head -c 6344 2022-04-23-00\:00\:37.bin > test2.bin +# and +# diff test2.bin test.bin diff --git a/tests/test2.bin b/tests/test2.bin new file mode 100644 index 0000000..9afba22 Binary files /dev/null and b/tests/test2.bin differ