从日志中截取了无法解析的字符串存储到文件中,之后进行解码
点击此处查看 java日志中的乱码日志
点击此处查看 解码后的正常数据
由于我这里从部分数据中可以推测到是什么,发现存在统一规律:
- 0xC2出现的时候都是多余的字符
- 0xC3出现的时候,其后紧跟着的字符需要 +0x40 才是原始的字符。
然后就用cpp代码来还原日志文件了😀
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
//#define ENABLE_ASSERT #include <iostream> #include <fstream> #include <vector> #include <algorithm> using namespace std; int main(int argc, const char * argv[]) { std::ifstream file("origin-from-log.txt", std::ios::binary); vector<char> vec; if (!file.eof() && !file.fail()) { file.seekg(0, std::ios_base::end); std::streampos fileSize = file.tellg(); vec.resize(fileSize); file.seekg(0, std::ios_base::beg); file.read(&vec[0], fileSize); } vector<char> output; // 解码部分 for( int i = 0; i < vec.size(); i++){ if( vec[i] == (char)0xC2){ // 跳过0xC2 i++; } else if( vec[i] == (char)0xC3){ // 跳过0xC3,但是对随后的字符+0x40 i++; output.push_back( (unsigned char)vec[i] + 0x40); continue; } output.push_back( vec[i]); } std::ofstream ofile("decode-from-log.txt", std::ios::binary); ofile.write( &output[0], output.size()); output.push_back( 0); std::cout << &output[0] << endl; return 0; } |