[英]How to convert hex to string?
我有一些十六進制數據:
48|65|6c|6c|6f|20|53|68|61|72|6f|6b|2e|
20|3d|43|46|3d|46|30|3d|45|38|3d|45|32|3d|45|35|3d|46|32|0d|0a|0d|0a|2e|0d|0a|
第一個文本字符串是“ Hello Sharok”(不帶引號)。 第二個文本字符串是“Привет”(不帶引號,俄語中的“Привет”是“ Hello”)。 如何將其轉換為可讀的文本(第一個字符串正確,第二個字符串失敗。)?
代碼頁:Windows-1251( CP1251 )
第二個字符串不是Windows-1251,而是帶引號的可打印字符“ =CF=F0=E8=E2=E5=F2<CR><LF><CR><LF>.
”和其中的已解碼字符實際上是Windows-1251。 因此,您需要迭代字符串,並一一構建輸出字符串。 如果遇到轉義符(=),則接下來的兩個字符是Windows-1251的十六進制數字。 解碼兩個數字並將結果字符添加到輸出字符串。 循環播放直至結束。
對於第二個,您可以使用以下命令:
string input="20|3d|43|46|3d|46|30|3d|45|38|3d|45|32|3d|45|35|3d|46|32|0d|0a|0d|0a|2e|0d|0a";
byte[] bytes=input.Split('|').Select(s=>byte.Parse(s, System.Globalization.NumberStyles.HexNumber)).ToArray();
string text = Encoding.GetEncoding(1251).GetString(bytes);
StringBuilder text2=new StringBuilder();
for(int i=0;i<text.Length;i++)
{
if (text[i]=='=')
{
string hex=text[i+1].ToString()+text[i+2].ToString();
byte b=byte.Parse(hex, System.Globalization.NumberStyles.HexNumber);
text2.Append(Encoding.GetEncoding(1251).GetString(new byte[]{b}));
i+=2;
}
else
{
text2.Append(text[i]);
}
}
首先,它解碼| 分隔的字符串。 以下循環將對其中包含=轉義的十六進制值進行解碼。
為Windows-1251編碼創建一個Encoding
對象,並解碼字節數組:
byte[] data = {
0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x53, 0x68, 0x61, 0x72, 0x6f, 0x6b, 0x2e
};
string text = Encoding.GetEncoding(1251).GetString(data);
第二組數據不會解碼為俄語字符,而是解碼為俄語字符(包括三行中的每一行的開頭和換行符(CR + LF)的結尾):
=CF=F0=E8=E2=E5=F2
.
要獲取所需的字符串,首先必須將數據解碼為字符串,然后從字符串中提取十六進制代碼,將其轉換為字節,然后對這些字節進行解碼:
Encoding win = Encoding.GetEncoding(1251);
string text = win.GetString(
Regex.Matches(win.GetString(data), "=(..)")
.OfType<Match>()
.Select(m => Convert.ToByte(m.Groups[1].Value, 16))
.ToArray()
);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.