| 451 | } |
| 452 | |
| 453 | inline void write_header( |
| 454 | std::ostream& out, const std::string& descr, bool fortran_order, |
| 455 | const std::vector<ndarray_len_t>& shape_v) { |
| 456 | std::string header_dict = write_header_dict(descr, fortran_order, shape_v); |
| 457 | |
| 458 | size_t length = magic_string_length + 2 + 2 + header_dict.length() + 1; |
| 459 | |
| 460 | unsigned char version[2] = {1, 0}; |
| 461 | if (length >= 255 * 255) { |
| 462 | length = magic_string_length + 2 + 4 + header_dict.length() + 1; |
| 463 | version[0] = 2; |
| 464 | version[1] = 0; |
| 465 | } |
| 466 | size_t padding_len = 16 - length % 16; |
| 467 | std::string padding(padding_len, ' '); |
| 468 | |
| 469 | // write magic |
| 470 | write_magic(out, version[0], version[1]); |
| 471 | |
| 472 | // write header length |
| 473 | if (version[0] == 1 && version[1] == 0) { |
| 474 | char header_len_le16[2]; |
| 475 | uint16_t header_len = |
| 476 | static_cast<uint16_t>(header_dict.length() + padding.length() + 1); |
| 477 | |
| 478 | header_len_le16[0] = (header_len >> 0) & 0xff; |
| 479 | header_len_le16[1] = (header_len >> 8) & 0xff; |
| 480 | out.write(reinterpret_cast<char*>(header_len_le16), 2); |
| 481 | } else { |
| 482 | char header_len_le32[4]; |
| 483 | uint32_t header_len = |
| 484 | static_cast<uint32_t>(header_dict.length() + padding.length() + 1); |
| 485 | |
| 486 | header_len_le32[0] = (header_len >> 0) & 0xff; |
| 487 | header_len_le32[1] = (header_len >> 8) & 0xff; |
| 488 | header_len_le32[2] = (header_len >> 16) & 0xff; |
| 489 | header_len_le32[3] = (header_len >> 24) & 0xff; |
| 490 | out.write(reinterpret_cast<char*>(header_len_le32), 4); |
| 491 | } |
| 492 | |
| 493 | out << header_dict << padding << '\n'; |
| 494 | } |
| 495 | |
| 496 | inline std::string read_header(std::istream& istream) { |
| 497 | // check magic bytes an version number |
no test coverage detected