mirror of
https://github.com/crskycode/GARbro.git
synced 2026-07-08 01:30:18 +08:00
(DpkOpener): use Path.GetFileName to strip path off filename.
This commit is contained in:
@@ -120,6 +120,7 @@ namespace GameRes.Formats.Dac
|
|||||||
return null;
|
return null;
|
||||||
|
|
||||||
var options = Query<DpkOptions> (arcStrings.ArcEncryptedNotice);
|
var options = Query<DpkOptions> (arcStrings.ArcEncryptedNotice);
|
||||||
|
var name_bytes = new byte[0x20];
|
||||||
var dir = new List<Entry> (count);
|
var dir = new List<Entry> (count);
|
||||||
int base_offset = 4 + count * 4;
|
int base_offset = 4 + count * 4;
|
||||||
for (int i = 0; i < count; ++i)
|
for (int i = 0; i < count; ++i)
|
||||||
@@ -133,13 +134,21 @@ namespace GameRes.Formats.Dac
|
|||||||
continue;
|
continue;
|
||||||
if ('z' == index[name_end-1])
|
if ('z' == index[name_end-1])
|
||||||
--name_end; // strip 'z' from file extensions
|
--name_end; // strip 'z' from file extensions
|
||||||
var name = Encodings.cp932.GetString (index, name_begin, name_end-name_begin);
|
|
||||||
|
int name_length = name_end - name_begin;
|
||||||
|
var name = Encodings.cp932.GetString (index, name_begin, name_length);
|
||||||
|
if (name_length > name_bytes.Length)
|
||||||
|
name_bytes = new byte[name_length];
|
||||||
|
// shift-jis characters sequence may contain '\\' that is not a path delimiter
|
||||||
|
string name_base = Path.GetFileName (name);
|
||||||
|
name_length = Encodings.cp932.GetBytes (name_base, 0, name_base.Length, name_bytes, 0);
|
||||||
|
|
||||||
uint size = LittleEndian.ToUInt32 (index, index_offset + 4);
|
uint size = LittleEndian.ToUInt32 (index, index_offset + 4);
|
||||||
var entry = new DpkEntry
|
var entry = new DpkEntry
|
||||||
{
|
{
|
||||||
Name = name,
|
Name = name,
|
||||||
Type = FormatCatalog.Instance.GetTypeFromName (name),
|
Type = FormatCatalog.Instance.GetTypeFromName (name),
|
||||||
Hash = GetNameHash (index, name_begin, name_end-name_begin, options.Key1, options.Key2, size),
|
Hash = GetNameHash (name_bytes, 0, name_length, options.Key1, options.Key2, size),
|
||||||
Offset = data_offset + LittleEndian.ToUInt32 (index, index_offset),
|
Offset = data_offset + LittleEndian.ToUInt32 (index, index_offset),
|
||||||
Size = size,
|
Size = size,
|
||||||
};
|
};
|
||||||
@@ -187,7 +196,7 @@ namespace GameRes.Formats.Dac
|
|||||||
private uint GetNameHash (byte[] name, int begin, int length, uint key1, uint key2, uint entry_size)
|
private uint GetNameHash (byte[] name, int begin, int length, uint key1, uint key2, uint entry_size)
|
||||||
{
|
{
|
||||||
uint hash = 0;
|
uint hash = 0;
|
||||||
for (int i = begin+length-1; i >= begin && name[i] != '\\'; --i)
|
for (int i = begin+length-1; i >= begin; --i)
|
||||||
{
|
{
|
||||||
hash += key1 + key2 * (entry_size + name[i]);
|
hash += key1 + key2 * (entry_size + name[i]);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user