Fix decoding 0xE5 character in first byte of short name

This commit is contained in:
Rafał Harabień 2018-06-25 00:16:14 +02:00
parent be96ba8122
commit f9ca0f95ce

View File

@ -38,6 +38,7 @@ pub(crate) const LFN_PART_LEN: usize = 13;
pub(crate) const DIR_ENTRY_SIZE: u64 = 32; pub(crate) const DIR_ENTRY_SIZE: u64 = 32;
pub(crate) const DIR_ENTRY_FREE_FLAG: u8 = 0xE5; pub(crate) const DIR_ENTRY_FREE_FLAG: u8 = 0xE5;
pub(crate) const LFN_ENTRY_LAST_FLAG: u8 = 0x40; pub(crate) const LFN_ENTRY_LAST_FLAG: u8 = 0x40;
pub(crate) const LFN_ENTRY_REALLY_E5_FLAG: u8 = 0x05;
/// Decoded file short name /// Decoded file short name
#[derive(Clone, Debug, Default)] #[derive(Clone, Debug, Default)]
@ -64,6 +65,10 @@ impl ShortName {
// No extension - return length of name part // No extension - return length of name part
name_len name_len
}; };
// FAT encodes character 0xE5 as 0x05 because 0xE5 marks deleted files
if name[0] == LFN_ENTRY_REALLY_E5_FLAG {
name[0] = 0xE5;
}
// Short names in FAT filesystem are encoded in OEM code-page // Short names in FAT filesystem are encoded in OEM code-page
ShortName { ShortName {
name, name,
@ -798,6 +803,12 @@ mod tests {
assert_eq!(ShortName::new(&raw_short_name).to_string(), "LOOK AT"); assert_eq!(ShortName::new(&raw_short_name).to_string(), "LOOK AT");
} }
#[test]
fn short_name_05_changed_to_e5() {
let raw_short_name = [0x05;11];
assert_eq!(ShortName::new(&raw_short_name).as_bytes(), [0xE5, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, '.' as u8, 0x05, 0x05, 0x05]);
}
#[test] #[test]
fn lowercase_short_name() { fn lowercase_short_name() {
let mut raw_short_name = [0u8;11]; let mut raw_short_name = [0u8;11];