/
smychkov
/
SStorage
Обзор
Документация
Войти
/
smychkov
/
SStorage
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/sstable/footer.cpp
97 строк
3 KB
Андрей Смычков
docs: перевод оставшихся комментариев на русский + актуализация AGENTS
25 апр 2026, 10:08
25 апр 2026, 10:08
f2b9fd9
Код
Авторство
О чём код?
#include "footer.hpp" #include "../util/crc32c.hpp" #include <cstring> namespace sstorage { namespace { //============================================================================ // Запись/чтение целых чисел в little-endian (для кроссплатформенности) //============================================================================ void writeU64LE(char* out, uint64_t v) { for (int i = 0; i < 8; ++i) { out[i] = static_cast<char>((v >> (i * 8)) & 0xFF); } } void writeU32LE(char* out, uint32_t v) { for (int i = 0; i < 4; ++i) { out[i] = static_cast<char>((v >> (i * 8)) & 0xFF); } } uint64_t readU64LE(const char* in) { uint64_t v = 0; for (int i = 0; i < 8; ++i) { v |= static_cast<uint64_t>(static_cast<uint8_t>(in[i])) << (i * 8); } return v; } uint32_t readU32LE(const char* in) { uint32_t v = 0; for (int i = 0; i < 4; ++i) { v |= static_cast<uint32_t>(static_cast<uint8_t>(in[i])) << (i * 8); } return v; } } //============================================================================ // Сериализация //============================================================================ void Footer::serialize(std::string& out) const { char buf[kFooterSize]; std::memset(buf, 0, kFooterSize); writeU64LE(buf + 0, indexOffset); writeU64LE(buf + 8, indexSize); writeU64LE(buf + 16, bloomOffset); writeU64LE(buf + 24, bloomSize); writeU64LE(buf + 32, numRecords); writeU32LE(buf + 40, version); // CRC по первым 44 байтам uint32_t crc = util::crc32c(buf, 44); writeU32LE(buf + 44, crc); // 48..55 reserved (уже нули из memset) writeU64LE(buf + 56, kSSTableMagic); out.append(buf, kFooterSize); } //============================================================================ // Десериализация //============================================================================ bool Footer::deserialize(const char* data, size_t len) { if (len < kFooterSize) return false; // Сначала проверяем magic — быстрый skip невалидных файлов uint64_t magic = readU64LE(data + 56); if (magic != kSSTableMagic) return false; // Проверка CRC по первым 44 байтам uint32_t expectedCrc = readU32LE(data + 44); uint32_t actualCrc = util::crc32c(data, 44); if (expectedCrc != actualCrc) return false; // Читаем поля indexOffset = readU64LE(data + 0); indexSize = readU64LE(data + 8); bloomOffset = readU64LE(data + 16); bloomSize = readU64LE(data + 24); numRecords = readU64LE(data + 32); version = readU32LE(data + 40); // Проверка версии (на случай будущих изменений формата) if (version != kSSTableVersion) return false; return true; } }