#include #include #include #include #include #include #include #include #include // 2026-10-21: 性能版构建开关——关闭所有日志写盘(战力插件等功能不受影响)。 #ifndef DNF90_SILENT_LOG #define DNF90_SILENT_LOG 1 #endif static std::wstring HexToWString(const unsigned char* data, size_t length) { std::wstringstream wss; wss << std::hex << std::uppercase << std::setfill(L'0'); for (size_t i = 0; i < length; ++i) { wss << std::setw(2) << static_cast(data[i]); if (i != length - 1) { wss << L" "; } } return wss.str(); } static std::vector HexToWStrings(const unsigned char* data, size_t length, size_t bytesPerLine = 16) { std::vector lines; std::wstringstream wss; wss << std::hex << std::uppercase << std::setfill(L'0'); for (size_t i = 0; i < length; ++i) { wss << std::setw(2) << static_cast(data[i]); if ((i + 1) % bytesPerLine == 0 || i == length - 1) { lines.push_back(wss.str()); wss.str(L""); wss.clear(); } else { wss << L" "; } } return lines; } static void AppendFileLogLine(const wchar_t* filename, const std::wstring& line) { #ifdef DNF90_SILENT_LOG (void)filename; (void)line; return; #endif FILE* fp = NULL; _wfopen_s(&fp, filename, L"a, ccs=UTF-8"); if (fp) { fwprintf(fp, L"%s\n", line.c_str()); fclose(fp); } } static void AppendFileLogLines(const wchar_t* filename, const std::vector& lines) { #ifdef DNF90_SILENT_LOG (void)filename; (void)lines; return; #endif FILE* fp = NULL; _wfopen_s(&fp, filename, L"a, ccs=UTF-8"); if (fp) { for (const auto& line : lines) { fwprintf(fp, L"%s\n", line.c_str()); } fclose(fp); } } static void AppendFileLogFormatLine(const wchar_t* filename, const wchar_t* format, ...) { #ifdef DNF90_SILENT_LOG (void)filename; (void)format; return; #endif va_list args; va_start(args, format); int neededSize = _vscwprintf(format, args) + 1; va_end(args); wchar_t stackBuffer[2048]; wchar_t* buffer = stackBuffer; if (neededSize > _countof(stackBuffer)) { buffer = (wchar_t*)malloc(neededSize * sizeof(wchar_t)); if (!buffer) return; } va_start(args, format); vswprintf_s(buffer, neededSize > _countof(stackBuffer) ? neededSize : _countof(stackBuffer), format, args); va_end(args); AppendFileLogLine(filename, std::wstring(buffer)); if (buffer != stackBuffer) free(buffer); } static void AppendHexLogLine(const wchar_t* filename, const unsigned char* data, size_t length) { #ifdef DNF90_SILENT_LOG (void)filename; (void)data; (void)length; return; #endif std::wstring hexString = HexToWString(data, length); AppendFileLogLine(filename, hexString); } static void AppendHexLogLines(const wchar_t* filename, const unsigned char* data, size_t length, size_t bytesPerLine = 16) { #ifdef DNF90_SILENT_LOG (void)filename; (void)data; (void)length; (void)bytesPerLine; return; #endif std::vector hexLines = HexToWStrings(data, length, bytesPerLine); AppendFileLogLines(filename, hexLines); }