| 408 | } |
| 409 | |
| 410 | inline void write_header(std::ostream &out, const header_t &header) { |
| 411 | std::string header_dict = write_header_dict(header.dtype.str(), header.fortran_order, header.shape); |
| 412 | |
| 413 | size_t length = magic_string_length + 2 + 2 + header_dict.length() + 1; |
| 414 | |
| 415 | version_t version{1, 0}; |
| 416 | if (length >= 255 * 255) { |
| 417 | length = magic_string_length + 2 + 4 + header_dict.length() + 1; |
| 418 | version = {2, 0}; |
| 419 | } |
| 420 | size_t padding_len = 16 - length % 16; |
| 421 | std::string padding(padding_len, ' '); |
| 422 | |
| 423 | // write magic |
| 424 | write_magic(out, version); |
| 425 | |
| 426 | // write header length |
| 427 | if (version == version_t{1, 0}) { |
| 428 | uint8_t header_len_le16[2]; |
| 429 | uint16_t header_len = static_cast<uint16_t>(header_dict.length() + padding.length() + 1); |
| 430 | |
| 431 | header_len_le16[0] = (header_len >> 0) & 0xff; |
| 432 | header_len_le16[1] = (header_len >> 8) & 0xff; |
| 433 | out.write(reinterpret_cast<char *>(header_len_le16), 2); |
| 434 | } else { |
| 435 | uint8_t header_len_le32[4]; |
| 436 | uint32_t header_len = static_cast<uint32_t>(header_dict.length() + padding.length() + 1); |
| 437 | |
| 438 | header_len_le32[0] = (header_len >> 0) & 0xff; |
| 439 | header_len_le32[1] = (header_len >> 8) & 0xff; |
| 440 | header_len_le32[2] = (header_len >> 16) & 0xff; |
| 441 | header_len_le32[3] = (header_len >> 24) & 0xff; |
| 442 | out.write(reinterpret_cast<char *>(header_len_le32), 4); |
| 443 | } |
| 444 | |
| 445 | out << header_dict << padding << '\n'; |
| 446 | } |
| 447 | |
| 448 | inline std::string read_header(std::istream &istream) { |
| 449 | // check magic bytes an version number |
no test coverage detected