-
Notifications
You must be signed in to change notification settings - Fork 0
Checksum Algorithm
Jon Daniel edited this page Nov 2, 2024
·
31 revisions
EPD POD1 POD2 POD3 POD4 POD5 POD6 Terminal Reality Home
- Checksum Algorithm
- Compression Algorithm
- Audit Trail
- String Helpers
- Version History
- Related Software
Checksum algorithm in use for EPD/POD2 and up is CRC-32/MPEG-2 available in crcle
poly : 0x04C11DB7
ref_in : false
ref_out : false
xor_in : 0xFFFFFFFF
xor_out : 0Checksum ranges
/* checksum */
POD2 : offset=sizeof(ident)+sizeof(checksum) count=sizeof(file )-offset
POD3 : offset=sizeof(ident)+sizeof(checksum) count=sizeof(header)-offset=280
POD4 : offset=sizeof(ident)+sizeof(checksum) count=sizeof(header)-offset
POD5 : offset=sizeof(ident)+sizeof(checksum) count=sizeof(header)-offset
EPD : offset=sizeof(header) count=sizeof(file )-offset
/* no checksum */
POD6 : offset=sizeof(header) count=sizeof(file )-offset
POD1 : offset=sizeof(header)=4+80 count=sizeof(file )-offsetenum section
{
none = 0,
file = 1,
header = 2,
extra = 3,
entry = 4,
audit = 5,
};
const std::pair<u32<1>, enum section> range[last] =
{
{ 0u , section::none },
{ sizeof(tr::pod<1>::header) , section::file },
{ sizeof(tr::pod<2>::header::ident) + sizeof(tr::pod<2>::header::checksum), section::file },
{ sizeof(tr::pod<3>::header::ident) + sizeof(tr::pod<3>::header::checksum), section::header },
{ sizeof(tr::pod<4>::header::ident) + sizeof(tr::pod<4>::header::checksum), section::header },
{ sizeof(tr::pod<5>::header::ident) + sizeof(tr::pod<5>::header::checksum), section::header },
{ sizeof(tr::pod<6>::header) , section::file },
{ sizeof(tr::epd::header) , section::file },
};
template<enum version version>
constexpr inline size_t section_size(size_t size)
{
switch(range[version].second)
{
case section::entry:
case section::file:
return size;
case section::header:
return sizeof(tr::pod<version>::header);
case section::none:
default:
return 0;
}
}
template<enum version version>
constexpr inline size_t section_offset()
{
switch(range[version].second)
{
case section::header:
case section::file:
return range[version].first;
case section::entry:
case section::none:
default:
return 0;
}
}
template<enum version version>
constexpr inline u32<1> checksum(uint8_t* buf, size_t size)
{
return crc32::mpeg2::compute(buf + section_offset<version>(), section_size<version>(size) - section_offset<version>());
}All information here is to my best knowledge, is is not proven by any official reference manual by Microsoft or Terminal Reality.