tgoop.com/cxx95/81
Create:
Last Update:
Last Update:
#creepy
char, который не char
В файлах разных форматах встречаются file signature - это какая-то последовательность байт, которая помогает подтвердить точный формат файла. Часто это значит, что в начале файла расположены "магические байты" специально для этого формата.
На википедии есть список сигнатур для многих форматов. Часто байты в начале файла человекочитаемы, то есть байты кодируют буквы латиницы - например Rar!
, LZIP
, OggS
.
Посмотрим на пример класса, который принимает четыре байта, а потом проверяет, является ли это сигнатурой RAR-файла:
class BinarySignature {Заметили ли вы что-то страшное? Это сравнение
public:
BinarySignature(int32_t value)
: Value_{value}
{}
int32_t AsInt() {
return Value_;
}
bool IsRar() {
return Value_ == 'Rar!';
}
private:
int32_t Value_;
};
int
с многосимвольным char
!Value_ == 'Rar!'Запись литерала
'X'
из одного символа везде поддерживается одинаково и имеет тип char
.Запись литерала
'XXXXX'
из нескольких символов имеет тип int
, но компилятор вправе не поддерживать такую запись. Также у этой записи implementation-defined числовое значение, то есть также отдано на откуп компилятору.Большинство компиляторов C++ поддерживают мульти-символьный литерал и переводят его в int как если бы это были последовательные байты.
Ссылка на godbolt.
Вот такой бывает удобный юзкейс, когда надо взаимодействовать с человекочитаемыми сигнатурами в бинарных файлах