发一发写的.uexp提取.atlas和.json的脚本,本来不想发的。然后一看.uexp的格式,啊,真的操蛋。提出来之后有几个json有小问题,懒得修了,直接手动修正。
import path from 'path'
import fs from "fs"
function scanDirectory(directory) {
fs.readdirSync(directory).forEach(file => {
const absolute = path.join(directory, file);
if (fs.statSync(absolute).isDirectory()) {
if (path.basename(absolute) !== 'Textures') {
return scanDirectory(absolute);
}
} else if (path.extname(absolute) === '.uexp') {
processUexpFile(absolute);
}
});
}
function processUexpFile(filePath) {
const originalData = fs.readFileSync(filePath);
let readPtr = 0, writePtr = 0;
while (readPtr < originalData.length) {
if (originalData[readPtr] !== 0x00) {
originalData[writePtr++] = originalData[readPtr];
}
readPtr++;
}
let data = originalData.slice(0, writePtr);
// console.log(dataString_temp);
// dataString_temp.length = index
// data = Buffer.from(dataString_temp, 'hex');
// console.log(data);
let dataStr = data.toString('utf8');
let startAtlas = dataStr.search(/\n[a-zA-Z_]/);
if (startAtlas !== -1) {
startAtlas++; // Adjust to point to the character after '\n'
}
// console.log(startAtlas);
const endAtlas = data.lastIndexOf(Buffer.from([0x69, 0x6E, 0x64, 0x65, 0x78, 0x3A, 0x20, 0x2D, 0x31])) + 10;
dataStr = dataStr.slice(endAtlas)
// const startJson = data.indexOf(Buffer.from([0x7B]), endAtlas);
let startJson = dataStr.search(/(\{\n)|(\{\")/) + endAtlas
if(startJson <= endAtlas) {
startJson = data.indexOf(Buffer.from([0x7B]), endAtlas);
}
console.log(startJson);
const endJson = data.lastIndexOf(Buffer.from([0x7D])) + 1;
if (startAtlas < endAtlas && startJson < endJson) {
const atlasData = data.slice(startAtlas, endAtlas);
const jsonData = data.slice(startJson, endJson);
const baseName = path.basename(filePath, path.extname(filePath));
const dirName = path.dirname(filePath);
fs.writeFileSync(path.join(dirName, baseName + '.atlas'), atlasData);
fs.writeFileSync(path.join(dirName, baseName + '.json'), jsonData);
console.log(path.join(dirName, baseName + '.atlas') + " 已保存");
console.log(path.join(dirName, baseName + '.json') + " 已保存");
}
}
// Replace '<your-directory>' with your directory path
scanDirectory('D:\\demo\\PUBG Dump');