整理常用字串操作方法至單一靜態類別,涵蓋移除空白、截斷、輸入過濾、大小寫轉換、DES/MD5 加密等功能,方便專案直接引用。
| 方法 | 說明 |
|---|---|
| RemoveBlank | 移除字串中所有空白字元 (ASCII 32) |
| CutStr(str, len, max) | 依指定長度換行,超過最大長度截斷並加「...」 |
| CutStr(str, len) | 依指定長度換行,不限制總長度 |
| PartSubString(str, len) | 超過長度截斷並加「...」 |
| InputText(text, maxLen) | 輸入過濾:去除 HTML 標籤、多餘空白、SQL 單引號轉義 |
| StringToLower(str) | 手動將大寫字母轉小寫 (教學用,實務用 ToLower()) |
| Encode(str, keyIndex) | DES 加密 (ECB 模式,固定三組金鑰) |
| Decode(str, keyIndex) | DES 解密 |
| GetMD5_32(str) | MD5 32 位小寫雜湊 |
| GetMd5_16(str) | MD5 16 位雜湊 (取中間 8 bytes) |
public static string InputText(string text, int maxLength)
{
if (string.IsNullOrEmpty(text)) return string.Empty;
text = text.Trim();
if (text.Length > maxLength) text = text.Substring(0, maxLength);
// 合併多餘空白
text = Regex.Replace(text, @"\s{2,}", " ");
// 移除
標籤轉換為換行
text = Regex.Replace(text, @"(<\s*[bB][rR]\s*/?\s*>)+|(<\s*[pP](.|\n)*?>)", "\n");
// 移除
text = Regex.Replace(text, @"(\s*&[nN][bB][sS][pP];\s*)+", " ");
// 移除所有其他 HTML 標籤
text = Regex.Replace(text, @"<(.|\n)*?>", string.Empty);
// 單引號轉義 (簡易 SQL 參數化前處理)
text = text.Replace("'", "''");
return text;
}
private static readonly string[] DesKeys = {
"BookT@#+!NumBq2",
"MagaZine@(21&*ID5",
"ThesisDSHI}._Y"
};
public static string Encode(string str, int keyIndex)
{
string key = DesKeys[keyIndex].Substring(0, 8);
using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
{
des.Key = Encoding.ASCII.GetBytes(key);
des.IV = Encoding.ASCII.GetBytes(key);
byte[] data = Encoding.GetEncoding("GB2312").GetBytes(str);
using (MemoryStream ms = new MemoryStream())
using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write))
{
cs.Write(data, 0, data.Length);
cs.FlushFinalBlock();
return BitConverter.ToString(ms.ToArray()).Replace("-", "");
}
}
}
public static string Decode(string str, int keyIndex)
{
string key = DesKeys[keyIndex].Substring(0, 8);
using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
{
des.Key = Encoding.ASCII.GetBytes(key);
des.IV = Encoding.ASCII.GetBytes(key);
byte[] data = new byte[str.Length / 2];
for (int i = 0; i < data.Length; i++)
data[i] = Convert.ToByte(str.Substring(i * 2, 2), 16);
using (MemoryStream ms = new MemoryStream())
using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write))
{
cs.Write(data, 0, data.Length);
cs.FlushFinalBlock();
return Encoding.GetEncoding("GB2312").GetString(ms.ToArray());
}
}
}
public static string GetMD5_32(string input)
{
using (MD5 md5 = MD5.Create())
{
byte[] hash = md5.ComputeHash(Encoding.Unicode.GetBytes(input));
return BitConverter.ToString(hash).Replace("-", "").ToLower();
}
}
public static string GetMd5_16(string input)
{
using (MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider())
{
byte[] hash = md5.ComputeHash(Encoding.Default.GetBytes(input));
// 取中間 8 bytes (索引 4~11)
return BitConverter.ToString(hash, 4, 8).Replace("-", "");
}
}
PBKDF2、bcrypt 或 Argon2 並加鹽。InputText 僅為輔助過濾,**務必搭配參數化查詢** 才能有效防禦 SQL Injection。UTF-8,避免 GB2312 造成跨平台亂碼。