当前位置: 首页 > news >正文

焦糖饼干头文件c++最新同步

\(\color{green}正在更新\)

windos-2.0

点击查看代码
#define _WIN32_WINNT 0x0601
//#pragma cpp_std c++11 
//你可以换成指令: -std=gnu++11
#include <bits/stdc++.h>
#include <Windows.h>
#include <string>
#include <algorithm>
#include <stdexcept>
#include <cctype>
#include <mutex>
#include <fstream>
#include <chrono>
#include <conio.h>
#include <limits>    // 用于清除输入缓冲区
#include <wininet.h>
#include <shlobj.h>
#include <powrprof.h>
#include <lmaccess.h>
#include <tlhelp32.h>
#include <commctrl.h>
#include <shellapi.h>
#include <mmsystem.h>
#include <psapi.h>
#include <thread>
#include <vector>
#include <map>
//#include <unistd.h> linux/macOS
using namespace std;//你需要定义 _agree_ 表示同意 CC BY-NC-ND 4.0
#ifndef _agree_
#undef _JTBG_H_
#define _JTBG_H_
#endif#ifndef _JTBG_H_
#define _JTBG_H_
#define MUL(a,b) (a)*(b)
#define __JTBG_NORETURN(a) ext(a)
#define MUS(a,b) (a)-(b)
#define PLS(a,b) (a)+(b)
#define DEF(a,b) (a)/(b)
class MD5 
{
private:typedef unsigned int uint32;typedef unsigned long long uint64;struct Context {uint32 state[4];uint32 count[2];unsigned char buffer[64];};static void init(Context &ctx) {ctx.count[0] = ctx.count[1] = 0;ctx.state[0] = 0x67452301;ctx.state[1] = 0xefcdab89;ctx.state[2] = 0x98badcfe;ctx.state[3] = 0x10325476;}static void update(Context &ctx, const unsigned char *input, size_t length) {uint32 i, index, partLen;index = (uint32)((ctx.count[0] >> 3) & 0x3F);if ((ctx.count[0] += ((uint32)length << 3)) < ((uint32)length << 3))ctx.count[1]++;ctx.count[1] += (uint32)(length >> 29);partLen = 64 - index;if (length >= partLen) {memcpy(&ctx.buffer[index], input, partLen);transform(ctx.state, ctx.buffer);for (i = partLen; i + 63 < length; i += 64)transform(ctx.state, &input[i]);index = 0;} else{i = 0;}memcpy(&ctx.buffer[index], &input[i], length - i);}static void final(unsigned char digest[16], Context &ctx) {unsigned char padding[64] = {0x80};unsigned char bits[8];size_t index, padLen;encode(bits, ctx.count, 8);index = (uint32)((ctx.count[0] >> 3) & 0x3f);padLen = (index < 56) ? (56 - index) : (120 - index);update(ctx, padding, padLen);update(ctx, bits, 8);encode(digest, ctx.state, 16);}static void transform(uint32 state[4], const unsigned char block[64]) {uint32 a = state[0], b = state[1], c = state[2], d = state[3], x[16];decode(x, block, 64);FF(a, b, c, d, x[0], 7, 0xd76aa478);FF(d, a, b, c, x[1], 12, 0xe8c7b756);FF(c, d, a, b, x[2], 17, 0x242070db);FF(b, c, d, a, x[3], 22, 0xc1bdceee);FF(a, b, c, d, x[4], 7, 0xf57c0faf);FF(d, a, b, c, x[5], 12, 0x4787c62a);FF(c, d, a, b, x[6], 17, 0xa8304613);FF(b, c, d, a, x[7], 22, 0xfd469501);FF(a, b, c, d, x[8], 7, 0x698098d8);FF(d, a, b, c, x[9], 12, 0x8b44f7af);FF(c, d, a, b, x[10], 17, 0xffff5bb1);FF(b, c, d, a, x[11], 22, 0x895cd7be);FF(a, b, c, d, x[12], 7, 0x6b901122);FF(d, a, b, c, x[13], 12, 0xfd987193);FF(c, d, a, b, x[14], 17, 0xa679438e);FF(b, c, d, a, x[15], 22, 0x49b40821);GG(a, b, c, d, x[1], 5, 0xf61e2562);GG(d, a, b, c, x[6], 9, 0xc040b340);GG(c, d, a, b, x[11], 14, 0x265e5a51);GG(b, c, d, a, x[0], 20, 0xe9b6c7aa);GG(a, b, c, d, x[5], 5, 0xd62f105d);GG(d, a, b, c, x[10], 9, 0x02441453);GG(c, d, a, b, x[15], 14, 0xd8a1e681);GG(b, c, d, a, x[4], 20, 0xe7d3fbc8);GG(a, b, c, d, x[9], 5, 0x21e1cde6);GG(d, a, b, c, x[14], 9, 0xc33707d6);GG(c, d, a, b, x[3], 14, 0xf4d50d87);GG(b, c, d, a, x[8], 20, 0x455a14ed);GG(a, b, c, d, x[13], 5, 0xa9e3e905);GG(d, a, b, c, x[2], 9, 0xfcefa3f8);GG(c, d, a, b, x[7], 14, 0x676f02d9);GG(b, c, d, a, x[12], 20, 0x8d2a4c8a);HH(a, b, c, d, x[5], 4, 0xfffa3942);HH(d, a, b, c, x[8], 11, 0x8771f681);HH(c, d, a, b, x[11], 16, 0x6d9d6122);HH(b, c, d, a, x[14], 23, 0xfde5380c);HH(a, b, c, d, x[1], 4, 0xa4beea44);HH(d, a, b, c, x[4], 11, 0x4bdecfa9);HH(c, d, a, b, x[7], 16, 0xf6bb4b60);HH(b, c, d, a, x[10], 23, 0xbebfbc70);HH(a, b, c, d, x[13], 4, 0x289b7ec6);HH(d, a, b, c, x[0], 11, 0xeaa127fa);HH(c, d, a, b, x[3], 16, 0xd4ef3085);HH(b, c, d, a, x[6], 23, 0x04881d05);HH(a, b, c, d, x[9], 4, 0xd9d4d039);HH(d, a, b, c, x[12], 11, 0xe6db99e5);HH(c, d, a, b, x[15], 16, 0x1fa27cf8);HH(b, c, d, a, x[2], 23, 0xc4ac5665);II(a, b, c, d, x[0], 6, 0xf4292244);II(d, a, b, c, x[7], 10, 0x432aff97);II(c, d, a, b, x[14], 15, 0xab9423a7);II(b, c, d, a, x[5], 21, 0xfc93a039);II(a, b, c, d, x[12], 6, 0x655b59c3);II(d, a, b, c, x[3], 10, 0x8f0ccc92);II(c, d, a, b, x[10], 15, 0xffeff47d);II(b, c, d, a, x[1], 21, 0x85845dd1);II(a, b, c, d, x[8], 6, 0x6fa87e4f);II(d, a, b, c, x[15], 10, 0xfe2ce6e0);II(c, d, a, b, x[6], 15, 0xa3014314);II(b, c, d, a, x[13], 21, 0x4e0811a1);II(a, b, c, d, x[4], 6, 0xf7537e82);II(d, a, b, c, x[11], 10, 0xbd3af235);II(c, d, a, b, x[2], 15, 0x2ad7d2bb);II(b, c, d, a, x[9], 21, 0xeb86d391);state[0] += a;state[1] += b;state[2] += c;state[3] += d;}static inline uint32 F(uint32 x, uint32 y, uint32 z) { return (x & y) | (~x & z); }static inline uint32 G(uint32 x, uint32 y, uint32 z) { return (x & z) | (y & ~z); }static inline uint32 H(uint32 x, uint32 y, uint32 z) { return x ^ y ^ z; }static inline uint32 I(uint32 x, uint32 y, uint32 z) { return y ^ (x | ~z); }static inline void FF(uint32 &a, uint32 b, uint32 c, uint32 d, uint32 x, uint32 s, uint32 t) {a += F(b, c, d) + x + t;a = (a << s) | (a >> (32 - s));a += b;}static inline void GG(uint32 &a, uint32 b, uint32 c, uint32 d, uint32 x, uint32 s, uint32 t) {a += G(b, c, d) + x + t;a = (a << s) | (a >> (32 - s));a += b;}static inline void HH(uint32 &a, uint32 b, uint32 c, uint32 d, uint32 x, uint32 s, uint32 t) {a += H(b, c, d) + x + t;a = (a << s) | (a >> (32 - s));a += b;}static inline void II(uint32 &a, uint32 b, uint32 c, uint32 d, uint32 x, uint32 s, uint32 t) {a += I(b, c, d) + x + t;a = (a << s) | (a >> (32 - s));a += b;}static void encode(unsigned char *output, const uint32 *input, size_t length) {for (size_t i = 0, j = 0; j < length; i++, j += 4) {output[j] = (unsigned char)(input[i] & 0xFF);output[j + 1] = (unsigned char)((input[i] >> 8) & 0xFF);output[j + 2] = (unsigned char)((input[i] >> 16) & 0xFF);output[j + 3] = (unsigned char)((input[i] >> 24) & 0xFF);}}static void decode(uint32 *output, const unsigned char *input, size_t length) {for (size_t i = 0, j = 0; j < length; i++, j += 4)output[i] = ((uint32)input[j]) | (((uint32)input[j + 1]) << 8) |(((uint32)input[j + 2]) << 16) | (((uint32)input[j + 3]) << 24);}public:static std::string hash(const std::string &input) {Context ctx;init(ctx);update(ctx, (const unsigned char*)input.c_str(), input.length());unsigned char digest[16];final(digest, ctx);char hex_str[33];for (int i = 0; i < 16; i++)sprintf(hex_str + i * 2, "%02x", digest[i]);hex_str[32] = '\0';return std::string(hex_str);}
};
//MD5::hash(str)unsigned long long pHash(const string& s) 
{const unsigned long long base = 911382629ULL;const unsigned long long mod = 1000000000000000003ULL;unsigned long long hashValue = 0;// 使用传统for循环兼容C++98for (size_t i = 0; i < s.size(); ++i) {char c = s[i];hashValue = (hashValue * base + static_cast<unsigned long long>(c)) % mod;}return hashValue;
}struct StringHash 
{static const unsigned long long base = 911382629ULL;static const unsigned long long mod = 1000000000000000003ULL;vector<unsigned long long> hash;vector<unsigned long long> power;StringHash(const string& s) {int n = s.size();hash.resize(n + 1);power.resize(n + 1);power[0] = 1;for (int i = 0; i < n; ++i) {hash[i+1] = (hash[i] * base + static_cast<unsigned long long>(s[i])) % mod;power[i+1] = (power[i] * base) % mod;}}// 获取子串s[l..r]的哈希值(0-based,包含l和r)unsigned long long getHash(int l, int r) {int len = r - l + 1;unsigned long long res = (hash[r+1] - hash[l] * power[len]) % mod;return res < 0 ? res + mod : res;}
};
//StringHash strHash(str);
//cout << "前缀哈希完整字符串: " << strHash.getHash(0, str.size()-1) << endl;
//cout << "子串哈希(0-4): " << strHash.getHash(0, 4) << " (对应\"Hello\")" << endl;size_t Hash(const string& s) 
{size_t hashVal = 0;for (size_t i = 0; i < s.size(); ++i) {// 简单的哈希组合算法hashVal = hashVal * 31 + static_cast<size_t>(s[i]);}return hashVal;
}    struct Save
{string path;int errorlevel=-1;ifstream save_i;ofstream save_o;void setpt(string s){path=s;return ;}void read_nol(){save_i.open(path.c_str());if(!save_i.good()) errorlevel=1100;return ;}void read_bin(){save_i.open(path.c_str(),ios::in|ios::binary);if(!save_i.good()) errorlevel=1100;return ;}void save_nol(){save_o.open(path.c_str());if(!save_o.good()) errorlevel=1000;return ;}void save_app(){save_o.open(path.c_str(),ios::app|ios::out);if(!save_o.good()) errorlevel=1000;return ;}void save_bin(){save_o.open(path.c_str(),ios::binary|ios::out);if(!save_o.good()) errorlevel=1000;return ;}//save_o.write(s.data(),s.size());void save_stop(){
//		save_i.close();save_o.close();return ;}void read_stop(){save_i.close();
//		save_o.close();return ;}
};string FileMD5(string path)
{ifstream file(path,ios::in|ios::binary);if (!file.is_open()) {return "";}string fileContent;file.seekg(0,ios::end);size_t fileSize = static_cast<size_t>(file.tellg());file.seekg(0,ios::beg);fileContent.reserve(fileSize);fileContent.assign(std::istreambuf_iterator<char>(file),std::istreambuf_iterator<char>());if (!file && !file.eof()) {return "";}return MD5::hash(fileContent);
}void say(string s,int t)
{if(t<0) return ;int len=int(s.length());for(int i=0;i<len;i++){cout<<s[i];Sleep(t);}return ;
}void pause(string s) 
{cout<<s<<endl;system("pause > nul");return ;
}int ext(int num)
{cout<<"[jtbg.h] Process exited with return value "<<num<<endl;exit(num);return num;
}template <typename to_string_T>
string tostring(to_string_T k)
{stringstream ans;ans<<k;return ans.str();
}int chkey(int t)
{if(t!=-1){t*=100;while(t--) {if (_kbhit()) {int key = _getch();return key;}}return -1;}else{while(1) {if (_kbhit()) {int key = _getch();return key;}}}
}enum Color 
{BLACK = 0,BLUE = 1,GREEN = 2,CYAN = 3,RED = 4,MAGENTA = 5,BROWN = 6,LIGHT_GRAY = 7,DARK_GRAY = 8,LIGHT_BLUE = 9,LIGHT_GREEN = 10,LIGHT_CYAN = 11,LIGHT_RED = 12,LIGHT_MAGENTA = 13,YELLOW = 14,WHITE = 15
};void scg(Color x,Color y)
{HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);// 设置文本颜色和背景颜色,高4位是背景,低4位是文本SetConsoleTextAttribute(hConsole, (y << 4) | x);return ;
}void scg(int x,int y)
{HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);// 设置文本颜色和背景颜色,高4位是背景,低4位是文本SetConsoleTextAttribute(hConsole, (y << 4) | x);return ;
}void set_back_color()
{scg(7,0);return ;
}int rd(int a,int b)
{srand(GetTickCount()+rand());return a+rand()%(b+1);
}enum TimeType
{yer=0,mon=1,dat=2,hor=3,mit=4,sec=5,mst=6,
};
int Gettime(TimeType x)
{time_t now = time(0);tm *localTime = localtime(&now);if(x==0) return 1900 + localTime->tm_year;//年份if(x==1) return 1 + localTime->tm_mon;//月份if(x==2) return localTime->tm_mday;//日期if(x==3) return localTime->tm_hour;//小时if(x==4) return localTime->tm_min;//分钟if(x==5) return localTime->tm_sec;//秒if(x==6) return GetTickCount();//msreturn -1;
}
int Gettime(string x)
{time_t now = time(0);tm *localTime = localtime(&now);if(x=="year") return 1900 + localTime->tm_year;//年份if(x=="mon") return 1 + localTime->tm_mon;//月份if(x=="dat") return localTime->tm_mday;//日期if(x=="hor") return localTime->tm_hour;//小时if(x=="mit") return localTime->tm_min;//分钟if(x=="sec") return localTime->tm_sec;//秒if(x=="mst") return GetTickCount();//msreturn -1;
}//控制台光标位置控制
void setcursor(int x,int y) 
{COORD coord;coord.X = x;coord.Y = y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}//隐藏/显示控制台光标
void setCVis(bool visible) 
{CONSOLE_CURSOR_INFO cursorInfo = {1, visible};SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursorInfo);
}//获取控制台尺寸
void getCSize(int &width,int &height) 
{CONSOLE_SCREEN_BUFFER_INFO csbi;GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);width = csbi.srWindow.Right - csbi.srWindow.Left + 1;height = csbi.srWindow.Bottom - csbi.srWindow.Top + 1;
}//生成指定长度的随机字符串
string randS(int length) 
{const string chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";string result;for (int i = 0; i < length; ++i) {result += chars[rand() % chars.size()];}return result;
}//计算文件大小(字节)
long long getFileSize(const string &filename)
{ifstream file(filename, ios::binary | ios::ate);if(!file.good()) return -1;return static_cast<long long>(file.tellg());
}//延迟函数(高精度ms)
void msSleep(int milliseconds) 
{auto start = chrono::high_resolution_clock::now();while (chrono::duration_cast<chrono::milliseconds>(chrono::high_resolution_clock::now() - start).count() < milliseconds);
}//检测文件读写是否
bool fileok(const string &filename) 
{ifstream file(filename);return file.good();
}//清除控制台指定区域内容
void clearCA(int x, int y, int width, int height) 
{for(int i=0;i<height;i++){setcursor(x, y + i);cout << string(width, ' ');}
}//计算文件夹内文件数量(仅统计一级目录)
int getFileCountInDir(const string& dirPath) {int count = 0;WIN32_FIND_DATA findData;HANDLE hFind = FindFirstFile((dirPath + "\\*").c_str(), &findData);if (hFind == INVALID_HANDLE_VALUE) return -1;do {if (!(findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {count++; // 只统计文件,不统计文件夹}} while (FindNextFile(hFind, &findData) != 0);FindClose(hFind);return count;
}double random(double min, double max) 
{return min + (max - min) * (rand() / (double)RAND_MAX);
}//检查字符串是否为数字(整数或小数)
bool isNumber(const string& str) 
{if (str.empty()) return false;size_t start = 0;if (str[0] == '+' || str[0] == '-') start = 1;bool hasDot = false;for (size_t i = start; i < str.size(); ++i) {if (str[i] == '.') {if (hasDot) return false;hasDot = true;}else if (!isdigit(str[i])) {return false;}}return true;
}struct memory
{long long bytes;double toB(){return static_cast<double>(bytes);}double toKB(){const double KB = 1024.0;return bytes / KB;}double toMB(){const double MB = 1024.0 * 1024.0;return bytes / MB;}double toGB(){const double GB = 1024.0 * 1024.0 * 1024.0;return bytes / GB;}double toTB(){const double TB = 1024.0 * 1024.0 * 1024.0 * 1024.0;return bytes / TB;}double toPB(){const double PB = 1024.0 * 1024.0 * 1024.0 * 1024.0 * 1024.0;return bytes / PB;}
};// 将字节转换为B(字节)
double rtoB(int bytes)
{return static_cast<double>(bytes);
}
// 将字节转换为KB(千字节)
double rtoKB(int bytes)
{const double KB = 1024.0;return bytes / KB;
}
// 将字节转换为MB(兆字节)
double rtoMB(int bytes)
{const double MB = 1024.0 * 1024.0;return bytes / MB;
}
// 将字节转换为GB(千兆字节)
double rtoGB(int bytes)
{const double GB = 1024.0 * 1024.0 * 1024.0;return bytes / GB;
}
// 将字节转换为TB(太字节)
double rtoTB(int bytes)
{const double TB = 1024.0 * 1024.0 * 1024.0 * 1024.0;return bytes / TB;
}
// 将字节转换为PB(拍字节)
double rtoPB(int bytes)
{const double PB = 1024.0 * 1024.0 * 1024.0 * 1024.0 * 1024.0;return bytes / PB;
}void lowerstring(string &s)
{for(int i=0;i<int(s.size());i++){if(s[i]>='A'&&s[i]<='Z'){s[i]=s[i]-'A'+'a';}}return ;
}
void uperstring(string &s)
{for(int i=0;i<int(s.size());i++){if(s[i]>='a'&&s[i]<='z'){s[i]=s[i]-'a'+'A';}}return ;
}void flushed() 
{cin.ignore(numeric_limits<streamsize>::max(), '\n');cin.clear();return ;
}//xor加/解密
string xorpass(const string &str, const string &key) 
{string result = str;size_t keyLen = key.size();if (keyLen == 0) return result;for (size_t i = 0; i < result.size(); ++i){result[i] ^= key[i % keyLen];}return result;
}string base64up(const string &str,const string &base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/") 
{string result;int val = 0, valBits = 0;for (unsigned char c : str) {val = (val << 8) + c;valBits += 8;while (valBits >= 6){result += base64Chars[(val >> (valBits - 6)) & 0x3F];valBits -= 6;}}if (valBits > 0) {val <<= (6 - valBits);result += base64Chars[val & 0x3F];}while (result.size() % 4 != 0) {result += '=';}return result;
}
string base64dec(const string &str,const string base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/") 
{string result;vector<int> val(4, -1); for (size_t i = 0; i < str.size(); ++i) {char c = str[i];if (c == '=') break;size_t pos = base64Chars.find(c);if (pos == string::npos) continue;val[i % 4] = pos;if (i % 4 == 3) {result += (val[0] << 2) + ((val[1] >> 4) & 0x3);if (val[2] != -1) {result += ((val[1] << 4) & 0xF0) + ((val[2] >> 2) & 0xF);}if (val[3] != -1) {result += ((val[2] << 6) & 0xC0) + val[3];}val.assign(4, -1);}}return result;
}void Testsuper(string &s) 
{if (s.empty()) return;s[0] = toupper(s[0]);for (size_t i = 1; i < s.size();i++) {s[i]=tolower(s[i]);}
}struct Timer
{private:using Clock = std::chrono::high_resolution_clock;using TimePoint = std::chrono::time_point<Clock>;TimePoint start_;TimePoint pause_;bool isRunning_;std::chrono::duration<double> elapsed_;public:Timer() : isRunning_(false), elapsed_(0) {}void starttick() {if (!isRunning_) {start_ = Clock::now();isRunning_ = true;}}void pausetick() {if (isRunning_) {pause_ = Clock::now();elapsed_ += pause_ - start_;isRunning_ = false;}}void resettick() {isRunning_ = false;elapsed_ = std::chrono::duration<double>(0);}double timesec() const {if (isRunning_) {auto now = Clock::now();return (elapsed_ + (now - start_)).count();}return elapsed_.count();}double timemst() const {return timesec() * 1000.0;}
};#ifndef _NOMATH_
#define _NOMATH_
constexpr double PI = 3.14159265358979323846264338327950288419716939937510582097494459;
constexpr double E = 2.71828182845904523536;
constexpr double SQRT2 = 1.41421356237309504880;
constexpr double DEG_TO_RAD = PI / 180.0;  // 角度转弧度系数
constexpr double RAD_TO_DEG = 180.0 / PI;  // 弧度转角度系数
//角度转弧度
inline double toRadians(double degrees) 
{return degrees * DEG_TO_RAD;
}// 弧度转角度
inline double toDegrees(double radians) 
{return radians * RAD_TO_DEG;
}// 计算阶乘
inline long long fac(int n) 
{if(n<0) return -1;long long result = 1;for (int i = 2; i <= n; ++i) {result *= i;}return result;
}double qpow(double base, int exponent) 
{if (exponent==0) return 1.0;if (base==0) return 0.0;bool isNegative = exponent < 0;unsigned int absExponent = static_cast<unsigned int>(isNegative ? -exponent : exponent);double result = 1.0;double current = base;while (absExponent > 0) {if (absExponent % 2 == 1) {result *= current;}current *= current;   absExponent /= 2;       }return isNegative ? 1.0 / result : result;
}long long A(int a, int b) 
{if(a < 0 || b < 0 || a < b) {return -1;}if (b == 0) { return 1;}long long result = 1;for (int i = 0; i < b; ++i) {result *= (a - i);if (result < 0) {return -1;}}return result;
}long long C(int a, int b)
{if (a < 0 || b < 0 || a < b) {return -1;}if (b == 0 || a == b) { return 1;}b = min(b, a - b);long long result = 1;for (int i = 1; i <= b; ++i) {result = result * (a - b + i) / i;if (result < 0) {return -1;}}return result;
}bool isHe(int x)
{if(x<2) return 0;for(int i=2;i*i<=x;i++){if(x%i==0) return 0;}return 1;
}
#endif#ifndef _NOSHORT_
#define _NOSHORT_
#define syst system("cls")
#define sys(x) system(x)
#define no_pause() system("pause > nul") 
#define pause() system("pause")
#define to_int(x) stoi(x)                   // 转换为int类型
#define to_long(x) stol(x)                  // 转换为long类型
#define to_double(x) stod(x)                // 转换为double类型
#define to_str(x) tostring(x)               // 转换为string类型
#define sleep(ms) Sleep(ms)                 // 延迟指定毫秒数
#define time_now() time(0)                  // 获取当前时间戳(秒级)
#define getms() GetTickCount()
#define shuta() system("shutdown -a")
#define shuts() system("shutdown -s -t 0")
#define shutr() system("shutdown -g -t 0")
#define about() jtbg_h_about()
#endifstruct logger
{Save rep;enum error_type{error=0,info=1,warn=2,debug=3,};void reset_logger(string path){rep.setpt(path);rep.save_nol();rep.save_o<<"["<<Gettime(yer)<<"/"<<Gettime(mon)<<"/"<<Gettime(dat)<<"-"<<Gettime(hor)<<":"<<Gettime(mit)<<":"<<Gettime(sec)<<"]"<<endl;return ;}void report(string s,error_type tp){rep.save_o<<"["<<Gettime(hor)<<":"<<Gettime(mit)<<":"<<Gettime(sec)<<"("<<Gettime(mst)%1000<<")] ";if(tp==0) rep.save_o<<"{type=error} ";else if(tp==1) rep.save_o<<"{type=info} ";else if(tp==2) rep.save_o<<"{type=warn} ";else if(tp==3) rep.save_o<<"{type=debug} ";else rep.save_o<<"{type=unknow} ";rep.save_o<<s<<endl;flush(rep.save_o);return ;}void stop(){rep.save_stop();return ;}
};void thred(logger p,string s)
{p.report(s,logger::error);return ;
}string xorFile(const string& filePath,const string& key) 
{if (key.empty()) {return "";}std::ifstream file(filePath.c_str(), std::ios::in | std::ios::binary);if (!file.is_open()) {return "";}std::string fileContent;char buffer[4096];while (file.read(buffer, sizeof(buffer))) {fileContent.append(buffer, sizeof(buffer));}fileContent.append(buffer, file.gcount());const size_t keyLen = key.size();size_t keyIndex = 0;for (string::iterator it = fileContent.begin(); it != fileContent.end(); ++it) {*it = static_cast<char>(static_cast<uint8_t>(*it) ^ static_cast<uint8_t>(key[keyIndex]));keyIndex = (keyIndex + 1) % keyLen;}return fileContent;
}void xortoFile(const string& filePath,const string& key) 
{if (key.empty()) {return ;}ifstream file(filePath.c_str(),ios::in | ios::binary);if (!file.is_open()) {return ; }string fileContent;char buffer[4096];while (file.read(buffer, sizeof(buffer))) {fileContent.append(buffer, sizeof(buffer));}fileContent.append(buffer, file.gcount());file.close();const size_t keyLen = key.size();size_t keyIndex = 0;for (std::string::iterator it = fileContent.begin(); it != fileContent.end(); ++it) {*it = static_cast<char>(static_cast<uint8_t>(*it) ^ static_cast<uint8_t>(key[keyIndex]));keyIndex = (keyIndex + 1) % keyLen;}std::ofstream outFile(filePath.c_str(), std::ios::out | std::ios::binary | std::ios::trunc);if (outFile.is_open()) {outFile.write(fileContent.data(), fileContent.size());outFile.close();}
}void caesarFile(const string& filePath,int shift) 
{shift %= 256;if (shift < 0) {shift += 256;}std::ifstream file(filePath.c_str(), std::ios::in | std::ios::binary);if (!file.is_open()) {return ;}string fileContent;char buffer[4096];while (file.read(buffer, sizeof(buffer))) {fileContent.append(buffer, sizeof(buffer));}fileContent.append(buffer, file.gcount());file.close(); for(string::iterator it = fileContent.begin(); it != fileContent.end();it++) {*it = static_cast<char>((static_cast<uint8_t>(*it) + shift) % 256);}std::ofstream outFile(filePath.c_str(), std::ios::out | std::ios::binary | std::ios::trunc);if (outFile.is_open()) {outFile.write(fileContent.data(), fileContent.size());outFile.close();}
}
//加
void FileCEnc(const string& filePath, int shift) 
{caesarFile(filePath, shift);
}
//解
void FileCDec(const string& filePath, int shift) 
{caesarFile(filePath, 256 - (shift % 256)); 
}//加密
string CEnc(const string& input, int shift) 
{shift %= 256;if (shift < 0) {shift += 256;}string result = input;const size_t len = result.size();for (size_t i = 0; i < len; ++i) {result[i] = static_cast<char>((static_cast<uint8_t>(result[i]) + shift) % 256);}return result;
}//解密
string CDec(const string& input, int shift) 
{shift %= 256;if (shift < 0) {shift += 256;}return CEnc(input, 256 - shift);
}void jtbg_h_about()
{cout<<"jtbg.h\n";cout<<"wroten by @jiaotangbinggan\n";cout<<"Process start with 2025/10/4\n";cout<<"Lv: 2.0.0 -std11\n";cout<<"Used CC BY-NC-ND 4.0\n";cout<<"join&talk to me(us):"<<endl;cout<<"luogu-1497734"<<endl;cout<<"197474286@qq.com"<<endl;cout<<"guitu1125@yeah.net"<<endl;cout<<"this file hash:none"<<endl;cout<<"this file will be new in a long time"<<endl;return ;
}
#endif

linux/macOS-Unix

点击查看代码
#define _JTBG_UNIX_VERSION "2.0.0(unix-1.0.0) -std=c++11"
#define _JTBG_LICENSE "CC BY-NC-ND 4.0"
// 适配Linux/macOS平台,替换Windows依赖头文件
#include <bits/stdc++.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <termios.h>
#include <sys/stat.h>
#include <dirent.h>
#include <fcntl.h>
#include <sys/time.h>
#include <ctime>
#include <cstdint>
#include <csignal>
#include <locale>
#include <codecvt>
using namespace std;// 防止头文件重复包含
#ifndef _JTBG_UNIX_H_
#define _JTBG_UNIX_H_// 基础数学运算宏定义
#define MUL(a,b) (a)*(b)
#define __JTBG_NORETURN(a) ext(a)
#define MUS(a,b) (a)-(b)
#define PLS(a,b) (a)+(b)
#define DEF(a,b) ((b)!=0?(a)/(b):throw invalid_argument("Division by zero"))// ========================== 1. 哈希计算模块 ==========================
class MD5 
{
private:typedef uint32_t uint32;typedef uint64_t uint64;struct Context {uint32 state[4];uint32 count[2];unsigned char buffer[64];};static void init(Context &ctx) {ctx.count[0] = ctx.count[1] = 0;ctx.state[0] = 0x67452301;ctx.state[1] = 0xefcdab89;ctx.state[2] = 0x98badcfe;ctx.state[3] = 0x10325476;}static void update(Context &ctx, const unsigned char *input, size_t length) {uint32 i, index, partLen;index = (uint32)((ctx.count[0] >> 3) & 0x3F);if ((ctx.count[0] += ((uint32)length << 3)) < ((uint32)length << 3))ctx.count[1]++;ctx.count[1] += (uint32)(length >> 29);partLen = 64 - index;if (length >= partLen) {memcpy(&ctx.buffer[index], input, partLen);transform(ctx.state, ctx.buffer);for (i = partLen; i + 63 < length; i += 64)transform(ctx.state, &input[i]);index = 0;} else {i = 0;}memcpy(&ctx.buffer[index], &input[i], length - i);}static void final(unsigned char digest[16], Context &ctx) {unsigned char padding[64] = {0x80};unsigned char bits[8];size_t index, padLen;encode(bits, ctx.count, 8);index = (uint32)((ctx.count[0] >> 3) & 0x3f);padLen = (index < 56) ? (56 - index) : (120 - index);update(ctx, padding, padLen);update(ctx, bits, 8);encode(digest, ctx.state, 16);}static void transform(uint32 state[4], const unsigned char block[64]) {uint32 a = state[0], b = state[1], c = state[2], d = state[3], x[16];decode(x, block, 64);#define FF(a,b,c,d,x,s,t) { a += F(b,c,d) + x + t; a = (a << s) | (a >> (32 - s)); a += b; }
#define GG(a,b,c,d,x,s,t) { a += G(b,c,d) + x + t; a = (a << s) | (a >> (32 - s)); a += b; }
#define HH(a,b,c,d,x,s,t) { a += H(b,c,d) + x + t; a = (a << s) | (a >> (32 - s)); a += b; }
#define II(a,b,c,d,x,s,t) { a += I(b,c,d) + x + t; a = (a << s) | (a >> (32 - s)); a += b; }FF(a,b,c,d,x[0],7,0xd76aa478); FF(d,a,b,c,x[1],12,0xe8c7b756);FF(c,d,a,b,x[2],17,0x242070db); FF(b,c,d,a,x[3],22,0xc1bdceee);FF(a,b,c,d,x[4],7,0xf57c0faf); FF(d,a,b,c,x[5],12,0x4787c62a);FF(c,d,a,b,x[6],17,0xa8304613); FF(b,c,d,a,x[7],22,0xfd469501);FF(a,b,c,d,x[8],7,0x698098d8); FF(d,a,b,c,x[9],12,0x8b44f7af);FF(c,d,a,b,x[10],17,0xffff5bb1); FF(b,c,d,a,x[11],22,0x895cd7be);FF(a,b,c,d,x[12],7,0x6b901122); FF(d,a,b,c,x[13],12,0xfd987193);FF(c,d,a,b,x[14],17,0xa679438e); FF(b,c,d,a,x[15],22,0x49b40821);GG(a,b,c,d,x[1],5,0xf61e2562); GG(d,a,b,c,x[6],9,0xc040b340);GG(c,d,a,b,x[11],14,0x265e5a51); GG(b,c,d,a,x[0],20,0xe9b6c7aa);GG(a,b,c,d,x[5],5,0xd62f105d); GG(d,a,b,c,x[10],9,0x02441453);GG(c,d,a,b,x[15],14,0xd8a1e681); GG(b,c,d,a,x[4],20,0xe7d3fbc8);GG(a,b,c,d,x[9],5,0x21e1cde6); GG(d,a,b,c,x[14],9,0xc33707d6);GG(c,d,a,b,x[3],14,0xf4d50d87); GG(b,c,d,a,x[8],20,0x455a14ed);GG(a,b,c,d,x[13],5,0xa9e3e905); GG(d,a,b,c,x[2],9,0xfcefa3f8);GG(c,d,a,b,x[7],14,0x676f02d9); GG(b,c,d,a,x[12],20,0x8d2a4c8a);HH(a,b,c,d,x[5],4,0xfffa3942); HH(d,a,b,c,x[8],11,0x8771f681);HH(c,d,a,b,x[11],16,0x6d9d6122); HH(b,c,d,a,x[14],23,0xfde5380c);HH(a,b,c,d,x[1],4,0xa4beea44); HH(d,a,b,c,x[4],11,0x4bdecfa9);HH(c,d,a,b,x[7],16,0xf6bb4b60); HH(b,c,d,a,x[10],23,0xbebfbc70);HH(a,b,c,d,x[13],4,0x289b7ec6); HH(d,a,b,c,x[0],11,0xeaa127fa);HH(c,d,a,b,x[3],16,0xd4ef3085); HH(b,c,d,a,x[6],23,0x04881d05);HH(a,b,c,d,x[9],4,0xd9d4d039); HH(d,a,b,c,x[12],11,0xe6db99e5);HH(c,d,a,b,x[15],16,0x1fa27cf8); HH(b,c,d,a,x[2],23,0xc4ac5665);II(a,b,c,d,x[0],6,0xf4292244); II(d,a,b,c,x[7],10,0x432aff97);II(c,d,a,b,x[14],15,0xab9423a7); II(b,c,d,a,x[5],21,0xfc93a039);II(a,b,c,d,x[12],6,0x655b59c3); II(d,a,b,c,x[3],10,0x8f0ccc92);II(c,d,a,b,x[10],15,0xffeff47d); II(b,c,d,a,x[1],21,0x85845dd1);II(a,b,c,d,x[8],6,0x6fa87e4f); II(d,a,b,c,x[15],10,0xfe2ce6e0);II(c,d,a,b,x[6],15,0xa3014314); II(b,c,d,a,x[13],21,0x4e0811a1);II(a,b,c,d,x[4],6,0xf7537e82); II(d,a,b,c,x[11],10,0xbd3af235);II(c,d,a,b,x[2],15,0x2ad7d2bb); II(b,c,d,a,x[9],21,0xeb86d391);#undef FF
#undef GG
#undef HH
#undef IIstate[0] += a;state[1] += b;state[2] += c;state[3] += d;}static inline uint32 F(uint32 x, uint32 y, uint32 z) { return (x & y) | (~x & z); }static inline uint32 G(uint32 x, uint32 y, uint32 z) { return (x & z) | (y & ~z); }static inline uint32 H(uint32 x, uint32 y, uint32 z) { return x ^ y ^ z; }static inline uint32 I(uint32 x, uint32 y, uint32 z) { return y ^ (x | ~z); }static void encode(unsigned char *output, const uint32 *input, size_t length) {for (size_t i = 0, j = 0; j < length; i++, j += 4) {output[j] = (unsigned char)(input[i] & 0xFF);output[j + 1] = (unsigned char)((input[i] >> 8) & 0xFF);output[j + 2] = (unsigned char)((input[i] >> 16) & 0xFF);output[j + 3] = (unsigned char)((input[i] >> 24) & 0xFF);}}static void decode(uint32 *output, const unsigned char *input, size_t length) {for (size_t i = 0, j = 0; j < length; i++, j += 4)output[i] = ((uint32)input[j]) | (((uint32)input[j + 1]) << 8) |(((uint32)input[j + 2]) << 16) | (((uint32)input[j + 3]) << 24);}public:static string hash(const string &input) {Context ctx;init(ctx);update(ctx, (const unsigned char*)input.c_str(), input.length());unsigned char digest[16];final(digest, ctx);char hex_str[33];for (int i = 0; i < 16; i++)snprintf(hex_str + i * 2, 3, "%02x", digest[i]);hex_str[32] = '\0';return string(hex_str);}
};// 字符串哈希(多项式哈希)
unsigned long long pHash(const string& s) 
{const unsigned long long base = 911382629ULL;const unsigned long long mod = 1000000000000000003ULL;unsigned long long hashValue = 0;for (size_t i = 0; i < s.size(); ++i) {char c = s[i];hashValue = (hashValue * base + static_cast<unsigned long long>(c)) % mod;}return hashValue;
}// 前缀哈希(支持子串哈希计算)
struct StringHash 
{static const unsigned long long base = 911382629ULL;static const unsigned long long mod = 1000000000000000003ULL;vector<unsigned long long> hash;vector<unsigned long long> power;StringHash(const string& s) {int n = s.size();hash.resize(n + 1);power.resize(n + 1);power[0] = 1;for (int i = 0; i < n; ++i) {hash[i+1] = (hash[i] * base + static_cast<unsigned long long>(s[i])) % mod;power[i+1] = (power[i] * base) % mod;}}// 获取子串s[l..r]的哈希值(0-based,包含l和r)unsigned long long getHash(int l, int r) {if (l > r || l < 0 || r >= (int)hash.size()-1)throw invalid_argument("Invalid substring range");int len = r - l + 1;unsigned long long res = (hash[r+1] - hash[l] * power[len]) % mod;return res < 0 ? res + mod : res;}
};// 基础字符串哈希(31为基数)
size_t Hash(const string& s) 
{size_t hashVal = 0;for (size_t i = 0; i < s.size(); ++i) {hashVal = hashVal * 31 + static_cast<size_t>(s[i]);}return hashVal;
}// ========================== 2. 文件操作模块 ==========================
struct Save
{string path;int errorlevel = -1;  // 1100:读失败, 1000:写失败ifstream save_i;ofstream save_o;// 设置文件路径void setpt(const string& s) { path = s; }// 文本方式读取(无锁)void read_nol() {save_i.open(path.c_str());if (!save_i.good()) errorlevel = 1100;}// 二进制方式读取void read_bin() {save_i.open(path.c_str(), ios::in | ios::binary);if (!save_i.good()) errorlevel = 1100;}// 文本方式写入(覆盖)void save_nol() {save_o.open(path.c_str());if (!save_o.good()) errorlevel = 1000;}// 文本方式追加写入void save_app() {save_o.open(path.c_str(), ios::app | ios::out);if (!save_o.good()) errorlevel = 1000;}// 二进制方式写入(覆盖)void save_bin() {save_o.open(path.c_str(), ios::binary | ios::out);if (!save_o.good()) errorlevel = 1000;}// 关闭写入流void save_stop() { save_o.close(); }// 关闭读取流void read_stop() { save_i.close(); }
};// 计算文件MD5值
string FileMD5(const string& path)
{ifstream file(path, ios::in | ios::binary);if (!file.is_open()) return "";string fileContent;file.seekg(0, ios::end);size_t fileSize = static_cast<size_t>(file.tellg());file.seekg(0, ios::beg);fileContent.reserve(fileSize);fileContent.assign(istreambuf_iterator<char>(file), istreambuf_iterator<char>());if (!file && !file.eof()) return "";return MD5::hash(fileContent);
}// 获取文件大小(字节)
long long getFileSize(const string& filename)
{struct stat fileStat;if (stat(filename.c_str(), &fileStat) != 0)return -1;return static_cast<long long>(fileStat.st_size);
}// 检查文件是否可读写
bool fileok(const string& filename) 
{ifstream file(filename);return file.good();
}// 统计文件夹内文件数量(仅一级目录,不包含子文件夹)
int getFileCountInDir(const string& dirPath) 
{DIR* dir = opendir(dirPath.c_str());if (dir == nullptr)return -1;int count = 0;struct dirent* entry;while ((entry = readdir(dir)) != nullptr) {// 跳过.和..目录if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)continue;// 判断是否为文件(非目录)string fullPath = dirPath + "/" + entry->d_name;struct stat statBuf;if (stat(fullPath.c_str(), &statBuf) == 0 && S_ISREG(statBuf.st_mode))count++;}closedir(dir);return count;
}// ========================== 3. 控制台控制模块 ==========================
// 控制台颜色枚举(ANSI转义码对应)
enum Color 
{BLACK = 30,      // 前景色:黑RED = 31,        // 前景色:红GREEN = 32,      // 前景色:绿YELLOW = 33,     // 前景色:黄BLUE = 34,       // 前景色:蓝MAGENTA = 35,    // 前景色:品红CYAN = 36,       // 前景色:青WHITE = 37,      // 前景色:白BRIGHT_BLACK = 90,   // 亮前景:黑BRIGHT_RED = 91,     // 亮前景:红BRIGHT_GREEN = 92,   // 亮前景:绿BRIGHT_YELLOW = 93,  // 亮前景:黄BRIGHT_BLUE = 94,    // 亮前景:蓝BRIGHT_MAGENTA = 95, // 亮前景:品红BRIGHT_CYAN = 96,    // 亮前景:青BRIGHT_WHITE = 97,   // 亮前景:白// 背景色(+40)BG_BLACK = 40,BG_RED = 41,BG_GREEN = 42,BG_YELLOW = 43,BG_BLUE = 44,BG_MAGENTA = 45,BG_CYAN = 46,BG_WHITE = 47,BG_BRIGHT_BLACK = 100,BG_BRIGHT_RED = 101,BG_BRIGHT_GREEN = 102,BG_BRIGHT_YELLOW = 103,BG_BRIGHT_BLUE = 104,BG_BRIGHT_MAGENTA = 105,BG_BRIGHT_CYAN = 106,BG_BRIGHT_WHITE = 107
};// 设置控制台文本颜色(前景色+背景色)
void scg(Color fg, Color bg)
{cout << "\033[" << static_cast<int>(fg) << ";" << static_cast<int>(bg) << "m";
}// 重置控制台颜色为默认
void set_back_color()
{cout << "\033[0m"; // ANSI重置码
}// 获取控制台尺寸(宽x高,单位:字符)
void getCSize(int &width, int &height) 
{struct winsize w;ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);width = w.ws_col;height = w.ws_row;
}// 设置控制台光标位置(x:列,y:行,0-based)
void setcursor(int x, int y) 
{cout << "\033[" << (y + 1) << ";" << (x + 1) << "H"; // ANSI光标定位码(1-based)
}// 隐藏/显示控制台光标
void setCVis(bool visible) 
{if (visible)cout << "\033[?25h"; // 显示光标elsecout << "\033[?25l"; // 隐藏光标
}// 清除控制台指定区域内容(x:起始列,y:起始行,width:宽度,height:高度)
void clearCA(int x, int y, int width, int height) 
{for (int i = 0; i < height; ++i) {setcursor(x, y + i);cout << string(width, ' ');}setcursor(x, y); // 回到起始位置
}// 清除整个控制台
void syst() 
{cout << "\033[2J\033[H"; // ANSI清屏+光标归位
}// ========================== 4. 时间与定时器模块 ==========================
// 时间类型枚举
enum TimeType
{yer = 0,  // 年份mon = 1,  // 月份(1-12)dat = 2,  // 日期(1-31)hor = 3,  // 小时(0-23)mit = 4,  // 分钟(0-59)sec = 5,  // 秒(0-59)mst = 6   // 毫秒(0-999)
};// 获取指定类型的时间(支持枚举参数)
int Gettime(TimeType x)
{time_t now = time(nullptr);tm *localTime = localtime(&now);switch (x){case yer: return 1900 + localTime->tm_year;case mon: return 1 + localTime->tm_mon;case dat: return localTime->tm_mday;case hor: return localTime->tm_hour;case mit: return localTime->tm_min;case sec: return localTime->tm_sec;case mst: {struct timeval tv;gettimeofday(&tv, nullptr);return tv.tv_usec / 1000; // 微秒转毫秒}default: return -1;}
}// 获取指定类型的时间(支持字符串参数)
int Gettime(const string& x)
{if (x == "year") return Gettime(yer);if (x == "mon")  return Gettime(mon);if (x == "dat")  return Gettime(dat);if (x == "hor")  return Gettime(hor);if (x == "mit")  return Gettime(mit);if (x == "sec")  return Gettime(sec);if (x == "mst")  return Gettime(mst);return -1;
}// 高精度定时器
struct Timer
{
private:using Clock = chrono::high_resolution_clock;using TimePoint = chrono::time_point<Clock>;TimePoint start_;TimePoint pause_;bool isRunning_;chrono::duration<double> elapsed_;public:Timer() : isRunning_(false), elapsed_(0) {}// 开始计时void starttick() {if (!isRunning_) {start_ = Clock::now();isRunning_ = true;}}// 暂停计时void pausetick() {if (isRunning_) {pause_ = Clock::now();elapsed_ += pause_ - start_;isRunning_ = false;}}// 重置计时void resettick() {isRunning_ = false;elapsed_ = chrono::duration<double>(0);}// 获取已流逝时间(秒)double timesec() const {if (isRunning_) {auto now = Clock::now();return (elapsed_ + (now - start_)).count();}return elapsed_.count();}// 获取已流逝时间(毫秒)double timemst() const {return timesec() * 1000.0;}
};// 延迟函数(毫秒,高精度)
void msSleep(int milliseconds) 
{this_thread::sleep_for(chrono::milliseconds(milliseconds));
}// 获取当前时间戳(秒级)
time_t time_now() 
{return time(nullptr);
}// 获取当前时间戳(毫秒级)
long long getms() 
{struct timeval tv;gettimeofday(&tv, nullptr);return (long long)tv.tv_sec * 1000 + tv.tv_usec / 1000;
}// ========================== 5. 数据加密与编码模块 ==========================
// XOR字符串加解密(密钥循环复用)
string xorpass(const string &str, const string &key) 
{if (key.empty()) return str;string result = str;size_t keyLen = key.size();for (size_t i = 0; i < result.size(); ++i){result[i] ^= key[i % keyLen];}return result;
}// XOR文件加解密(返回加密后内容)
string xorFile(const string& filePath, const string& key) 
{if (key.empty()) return "";int fd = open(filePath.c_str(), O_RDONLY | O_BINARY);if (fd == -1) return "";struct stat st;fstat(fd, &st);size_t fileSize = st.st_size;string fileContent(fileSize, 0);read(fd, &fileContent[0], fileSize);close(fd);const size_t keyLen = key.size();size_t keyIndex = 0;for (auto& c : fileContent) {c = static_cast<char>(static_cast<uint8_t>(c) ^ static_cast<uint8_t>(key[keyIndex]));keyIndex = (keyIndex + 1) % keyLen;}return fileContent;
}// XOR文件加解密(直接写入原文件)
void xortoFile(const string& filePath, const string& key) 
{if (key.empty()) return;int fd = open(filePath.c_str(), O_RDWR | O_BINARY);if (fd == -1) return;struct stat st;fstat(fd, &st);size_t fileSize = st.st_size;string fileContent(fileSize, 0);read(fd, &fileContent[0], fileSize);const size_t keyLen = key.size();size_t keyIndex = 0;for (auto& c : fileContent) {c = static_cast<char>(static_cast<uint8_t>(c) ^ static_cast<uint8_t>(key[keyIndex]));keyIndex = (keyIndex + 1) % keyLen;}lseek(fd, 0, SEEK_SET);write(fd, &fileContent[0], fileSize);close(fd);
}// 凯撒文件加解密(移位加密)
void caesarFile(const string& filePath, int shift) 
{shift %= 256;if (shift < 0) shift += 256;int fd = open(filePath.c_str(), O_RDWR | O_BINARY);if (fd == -1) return;struct stat st;fstat(fd, &st);size_t fileSize = st.st_size;string fileContent(fileSize, 0);read(fd, &fileContent[0], fileSize);for (auto& c : fileContent) {c = static_cast<char>((static_cast<uint8_t>(c) + shift) % 256);}lseek(fd, 0, SEEK_SET);write(fd, &fileContent[0], fileSize);close(fd);
}// 凯撒加密(字符串)
string CEnc(const string& input, int shift) 
{shift %= 256;if (shift < 0) shift += 256;string result = input;for (auto& c : result) {c = static_cast<char>((static_cast<uint8_t>(c) + shift) % 256);}return result;
}// 凯撒解密(字符串)
string CDec(const string& input, int shift) 
{shift %= 256;if (shift < 0) shift += 256;return CEnc(input, 256 - shift);
}// 文件凯撒加密
void FileCEnc(const string& filePath, int shift) 
{caesarFile(filePath, shift);
}// 文件凯撒解密
void FileCDec(const string& filePath, int shift) 
{caesarFile(filePath, 256 - (shift % 256));
}// Base64编码
string base64up(const string &str, const string &base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/") 
{string result;int val = 0, valBits = 0;for (unsigned char c : str) {val = (val << 8) + c;valBits += 8;while (valBits >= 6){result += base64Chars[(val >> (valBits - 6)) & 0x3F];valBits -= 6;}}if (valBits > 0) {val <<= (6 - valBits);result += base64Chars[val & 0x3F];}while (result.size() % 4 != 0) {result += '=';}return result;
}// Base64解码
string base64dec(const string &str, const string base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/") 
{string result;vector<int> val(4, -1); for (size_t i = 0; i < str.size(); ++i) {char c = str[i];if (c == '=') break;size_t pos = base64Chars.find(c);if (pos == string::npos) continue;val[i % 4] = pos;if (i % 4 == 3) {result += (val[0] << 2) + ((val[1] >> 4) & 0x3);if (val[2] != -1) {result += ((val[1] << 4) & 0xF0) + ((val[2] >> 2) & 0xF);}if (val[3] != -1) {result += ((val[2] << 6) & 0xC0) + val[3];}val.assign(4, -1);}}return result;
}// ========================== 6. 数学计算模块 ==========================
#ifndef _NOMATH_
#define _NOMATH_// 数学常量(高精度)
constexpr double PI = 3.14159265358979323846264338327950288419716939937510582097494459;
constexpr double E = 2.718281828459045235360287471352662497757247093699959574966967628;
constexpr double SQRT2 = 1.414213562373095048801688724209698078569671875376948073176679738;
constexpr double DEG_TO_RAD = PI / 180.0;  // 角度转弧度系数
constexpr double RAD_TO_DEG = 180.0 / PI;  // 弧度转角度系数// 角度转弧度
inline double toRadians(double degrees) 
{return degrees * DEG_TO_RAD;
}// 弧度转角度
inline double toDegrees(double radians) 
{return radians * RAD_TO_DEG;
}// 计算阶乘(n<0返回-1,溢出返回-1)
inline long long fac(int n) 
{if (n < 0) return -1;if (n == 0 || n == 1) return 1;long long result = 1;for (int i = 2; i <= n; ++i) {if (result > LLONG_MAX / i)  // 防止溢出return -1;result *= i;}return result;
}// 快速幂(支持负指数)
double qpow(double base, int exponent) 
{if (exponent == 0) return 1.0;if (base == 0.0) return 0.0;bool isNegative = exponent < 0;unsigned int absExponent = static_cast<unsigned int>(isNegative ? -exponent : exponent);double result = 1.0;double current = base;while (absExponent > 0) {if (absExponent % 2 == 1) result *= current;current *= current;   absExponent /= 2;       }return isNegative ? 1.0 / result : result;
}// 排列数计算(A(a,b) = a!/(a-b)!,非法输入返回-1)
long long A(int a, int b) 
{if (a < 0 || b < 0 || a < b) return -1;if (b == 0) return 1;long long result = 1;for (int i = 0; i < b; ++i) {if (result > LLONG_MAX / (a - i))  // 防止溢出return -1;result *= (a - i);}return result;
}// 组合数计算(C(a,b) = a!/(b!(a-b)!),非法输入返回-1)
long long C(int a, int b)
{if (a < 0 || b < 0 || a < b) return -1;if (b == 0 || a == b) return 1;// 优化:C(a,b) = C(a,a-b),取较小值减少计算b = min(b, a - b);long long result = 1;for (int i = 1; i <= b; ++i) {// 防止溢出:先乘后除(确保整除)if (result > LLONG_MAX / (a - b + i))return -1;result = result * (a - b + i) / i;}return result;
}// 判断素数(优化版:遍历至sqrt(x))
bool isHe(int x)
{if (x <= 1) return false;if (x == 2 || x == 3) return true;if (x % 2 == 0 || x % 3 == 0) return false;for (int i = 5; i * i <= x; i += 6) {if (x % i == 0 || x % (i + 2) == 0)return false;}return true;
}#endif // _NOMATH_// ========================== 7. 字符串处理模块 ==========================
// 字符串转为全小写
void lowerstring(string &s)
{for (auto& c : s) {if (c >= 'A' && c <= 'Z')c += ('a' - 'A');}
}// 字符串转为全大写
void uperstring(string &s)
{for (auto& c : s) {if (c >= 'a' && c <= 'z')c -= ('a' - 'A');}
}// 字符串首字母大写,其余小写
void Testsuper(string &s) 
{if (s.empty()) return;s[0] = toupper(s[0]);for (size_t i = 1; i < s.size(); ++i) {s[i] = tolower(s[i]);}
}// 清除输入缓冲区
void flushed() 
{cin.ignore(numeric_limits<streamsize>::max(), '\n');cin.clear();
}// 检查字符串是否为数字(支持整数和小数,可带正负号)
bool isNumber(const string& str) 
{if (str.empty()) return false;size_t start = 0;if (str[0] == '+' || str[0] == '-') start = 1;bool hasDot = false;for (size_t i = start; i < str.size(); ++i) {if (str[i] == '.') {if (hasDot) return false;  // 只能有一个小数点hasDot = true;}else if (!isdigit(str[i])) {return false;}}// 避免单独的符号或小数点(如"+"、"."、"-.")return (start < str.size()) && !(start == 1 && str.size() == 1) && !(hasDot && start == str.size() - 1);
}// 任意类型转为字符串(基于stringstream)
template <typename to_string_T>
string tostring(to_string_T k)
{stringstream ans;ans << k;return ans.str();
}// ========================== 8. 随机数模块 ==========================
// 生成指定区间整数随机数([a,b])
int rd(int a, int b)
{if (a > b) swap(a, b);// 基于当前时间初始化随机种子(避免多次调用导致重复)static bool seeded = false;if (!seeded) {srand(static_cast<unsigned int>(time(nullptr)) ^ getpid());seeded = true;}return a + (rand() % (b - a + 1));
}// 生成指定区间浮点数随机数([min,max])
double random(double min, double max) 
{if (min > max) swap(min, max);static bool seeded = false;if (!seeded) {srand(static_cast<unsigned int>(time(nullptr)) ^ getpid());seeded = true;}return min + (max - min) * (static_cast<double>(rand()) / RAND_MAX);
}// 生成指定长度的随机字符串(包含数字和大小写字母)
string randS(int length) 
{if (length <= 0) return "";const string chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";string result;result.reserve(length);static bool seeded = false;if (!seeded) {srand(static_cast<unsigned int>(time(nullptr)) ^ getpid());seeded = true;}for (int i = 0; i < length; ++i) {result += chars[rand() % chars.size()];}return result;
}// ========================== 9. 日志模块 ==========================
struct logger
{Save rep;enum error_type{error = 0,   // 错误info = 1,    // 信息warn = 2,    // 警告debug = 3    // 调试};// 初始化日志文件(覆盖原有内容)void reset_logger(const string& path){rep.setpt(path);rep.save_nol();if (rep.errorlevel != 1000) {rep.save_o << "[" << Gettime(yer) << "/" << Gettime(mon) << "/" << Gettime(dat) << "-" << Gettime(hor) << ":" << Gettime(mit) << ":" << Gettime(sec) << "] "<< "Logger initialized" << endl;}}// 写入日志void report(const string& s, error_type tp){if (!rep.save_o.good()) return;// 时间戳(精确到毫秒)rep.save_o << "[" << Gettime(hor) << ":" << Gettime(mit) << ":" << Gettime(sec) << "(" << Gettime(mst) << ")] ";// 日志类型switch (tp){case error: rep.save_o << "{type=error} "; break;case info:  rep.save_o << "{type=info} ";  break;case warn:  rep.save_o << "{type=warn} ";  break;case debug: rep.save_o << "{type=debug} "; break;default:    rep.save_o << "{type=unknow} ";}// 日志内容rep.save_o << s << endl;rep.save_o.flush();  // 强制刷新缓冲区}// 关闭日志文件void stop(){if (rep.save_o.good()) {rep.save_o << "[" << Gettime(hor) << ":" << Gettime(mit) << ":" << Gettime(sec) << "] Logger stopped" << endl;}rep.save_stop();}
};// ========================== 10. 系统操作与辅助模块 ==========================
// 执行系统命令
void sys(const string& cmd) 
{system(cmd.c_str());
}// 无提示暂停(等待按键)
void no_pause() 
{cout << "\033[?25h"; // 显示光标cout << "Press any key to continue...";flushed();getchar();cout << "\033[?25l"; // 隐藏光标
}// 标准暂停(带提示)
void pause() 
{system("read -n 1 -s -r -p \"Press any key to continue...\"");cout << endl;
}// 类型转换快捷宏
#define to_int(x) stoi(x)
#define to_long(x) stol(x)
#define to_double(x) stod(x)
#define to_str(x) tostring(x)
#define sleep(ms) msSleep(ms)// 进程退出(带提示)
int ext(int num)
{cout << "[jtbgunix.h] Process exited with return value " << num << endl;exit(num);return num;
}// 内存单位转换结构体
struct memory
{long long bytes;double toB()    { return static_cast<double>(bytes); }double toKB()   { return bytes / 1024.0; }double toMB()   { return bytes / (1024.0 * 1024.0); }double toGB()   { return bytes / (1024.0 * 1024.0 * 1024.0); }double toTB()   { return bytes / (1024.0 * 1024.0 * 1024.0 * 1024.0); }double toPB()   { return bytes / (1024.0 * 1024.0 * 1024.0 * 1024.0 * 1024.0); }
};// 内存单位转换全局函数
double rtoB(int bytes)    { return static_cast<double>(bytes); }
double rtoKB(int bytes)   { return bytes / 1024.0; }
double rtoMB(int bytes)   { return bytes / (1024.0 * 1024.0); }
double rtoGB(int bytes)   { return bytes / (1024.0 * 1024.0 * 1024.0); }
double rtoTB(int bytes)   { return bytes / (1024.0 * 1024.0 * 1024.0 * 1024.0); }
double rtoPB(int bytes)   { return bytes / (1024.0 * 1024.0 * 1024.0 * 1024.0 * 1024.0); }// 按字符延迟输出字符串
void say(const string& s, int t)
{if (t < 0) return;for (char c : s) {cout << c << flush;msSleep(t);}
}// 头文件信息
void jtbgunix_h_about()
{cout << "jtbgunix.h\n";cout << "Written by @jiaotangbinggan\n";cout << "Process started with 2025/10/4\n";cout << "Version: " << _JTBG_UNIX_VERSION << "\n";cout << "License: " << _JTBG_LICENSE << "\n";cout << "Contact:\n";cout << "  Luogu: luogu-1497734\n";cout << "  Email: 197474286@qq.com, guitu1125@yeah.net\n";cout << "This file hash: none\n";
}// 关于信息快捷宏
#define about() jtbgunix_h_about()#endif // _JTBG_UNIX_H_
http://www.hskmm.com/?act=detail&tid=26556

相关文章:

  • 2025 年最新三维扫描仪厂家权威推荐排行榜:空间 / 高精度 / 手持激光等类型设备优选企业全解析工业/便携式/拍照式/蓝光三维扫描仪厂家推荐
  • 2025 年上海刑事辩护律师 / 刑事案件律师 / 刑事诉讼律师 / 刑事犯罪律师 / 刑事纠纷律师事务所推荐:徐海燕律师团队专业法律服务
  • 垂起固定翼无人机应用及科技分析
  • 2025 年可行性研究报告公司最新推荐排行榜:权威筛选国内实力机构,助力企业精准选型
  • 2025 年离散制造领域 MES 厂商最新推荐榜单:全面解析头部服务商实力,助力企业数智化转型mes制造执行系统/mes系统 mes软件/mes生产制造执行系统/mes生产管理系统厂商推荐
  • 2025螺杆泵厂家最新推荐榜:高效耐用与专业定制实力之选
  • 稳时复位仿真攻略
  • 2025 年硫化仪厂家最新推荐排行榜:聚焦实力厂家技术亮点、售后保障及适配场景指南无转子/橡胶硫化仪/硫化仪门尼粘度仪/有转子硫化仪厂家推荐
  • 2025 年 WMS 公司最新推荐排行榜:全面盘点品牌核心技术优势助力仓储效率提升 28%+ 及选型指南 wms仓库管理软件/wms仓库管理系统软件/wms出入库管理系统公司推荐
  • T/CCSA 663-2025《医疗科研云平台科技要求》标准解读与深度分析
  • 题解:P14118 [SCCPC 2021] Hotpot
  • 编程笔记 - C++ 引用和指针的区别
  • 题解:P14127 [SCCPC 2021] K-skip Permutation
  • 题解:[P11184 带余除法]
  • 10 8
  • 2025双氧水厂家权威推荐榜:优质生产与稳定供应实力之选
  • 英国AI数据中心发展规划:技术挑战与产业反馈
  • 2025 年工业风机厂家最新推荐排行榜:涵盖离心高温防腐耐磨防爆等类型设备实力厂商精选高温/防腐/耐磨/防爆/除尘/不锈钢/锅炉风机厂家推荐
  • 2025 年拉力试验机厂家最新推荐榜单:聚焦专精特新企业技术实力与口碑,助力钢铁、线缆、轨道交通等行业精准选购
  • 2025 年最新推荐!种植牙医院权威榜单:聚焦连锁品牌与万级手术室,助您精准选靠谱口腔机构西宁种植牙口腔医院/西宁种植牙齿美容/西宁种植牙美容医院推荐
  • 高考数学易错考点01 | 临阵磨枪 - 教程
  • 2025 年西宁口腔医院最新推荐排行榜:实力解析与全周期口腔服务指南西宁口腔医院/西宁口腔美容/西宁口腔整形/西宁口腔正畸/西宁口腔修复推荐
  • 2025 年试验机厂家最新推荐榜单:专精特新企业深度解析,含疲劳 / 压力 / 液压万能等设备优质厂家水泥压力/压剪/锚链拉伸整形机/链条拉伸整形机厂家推荐
  • 2025 年最新推荐西安路灯厂家排行榜:市政 / LED / 智慧 / 太阳能 / 农村路灯优质企业全景指南
  • 2025 最新红绿灯厂家推荐排行榜:实力厂家技术与口碑深度解析,交通信号设备优选指南交通信号/路口红绿灯厂家推荐
  • 2025 土工材料厂家最新推荐榜:中铁合作厂商领衔,技术 / 案例双维度厂家深度甄选指南土工布/土工膜/土工格栅/复土工合膜厂家推荐
  • 2025 年帐篷源头厂家最新推荐排行榜:涵盖应急救灾 / 户外充气 / 露营充气 / 野营等品类,精选实力企业助采购
  • Claude Code完整安装部署指南:支持Windows/Linux/macOS三平台详细教程
  • 2025 杀虫公司最新推荐榜:权威筛选公司,靶向消杀与长效质保选购全指南
  • 2025 年电缆桥架生产厂家最新推荐榜单:聚焦北方 / 河北区域及多类型桥架,精选优质品牌深度解析瓦楞/防火/模压/镀锌桥架厂家推荐