簡體   English   中英

如何將十六進制轉換為字符串?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM