【问题标题】:Correct Encoding style for convert bytes[] to string将字节 [] 转换为字符串的正确编码样式
【发布时间】:2013-11-23 14:36:25
【问题描述】:

我正在尝试将byte 数组转换为字符串,我只需将byteArray 中的数字转换为字符串Foreg。 "12459865..."

我正在尝试这样做:

fileInString = Encoding.UTF8.GetString(fileInBytes, 0, fileInBytes.Length);

fileInBytes 看起来像这样:1212549878563212450045.... 但结果 fileInString 看起来像这样 ID3\0\0\0\0JTENC\0\0\0@\0\0WXXX\0... 和很多奇怪的字符。

我尝试了不同的编码风格,包括default,但都在其中插入了一些奇怪的字符。

我唯一的选择是将每个成员循环并转换为字符串

while (currbyte != -1)
{
    currbyte = fileStream.ReadByte();
    //fileInBytes[i++] = (byte)currbyte;
    fileInString += currbyte.ToString();
    progressBar1.Value = i++;
}

但这是TOO 慢。请告诉我如何使用Encoding.....GetString将字节数组转换为字符串

【问题讨论】:

  • 你如何得到像这样1212549878563212450045 的字节?你能把它分成每个字节吗?例如 12|12|54|98 ... 或 1|2||1|2|5|4|9|8...?
  • 我已经更新了我的问题,以解释我是如何将fileInBytes 数组制作成基本上像这里fileInBytes[i++] = (byte)currbyte; 一样的数组
  • 它很慢可能部分是因为你的progressBar1.Value = i++;,任何更新UI相关的代码都会减慢一切,你应该在更大的时间间隔内更新进度条以减少这种情况,甚至在某些情况下我们不会甚至不需要有关当前进程的任何确切信息,只需一些工作通知就足够了。
  • 接受 Tim S. 的答案,但 fileInString += 很慢,因为字符串是不可变的。如果你沿着这条路走,应该使用 StringBuilder。为什么你会有一个只需要几分之一秒的操作的进度条?

标签: c# .net arrays encoding


【解决方案1】:

如果您想将byte[] 编码为stringbase64 encoding 使用ConvertToBase64StringFromBase64String 方法是一个很好的方法:

string fileInString = Convert.ToBase64String(fileInBytes);
byte[] asBytesAgain = Convert.FromBase64String(fileInString);

您使用fileInString += currbyte.ToString(); 进行的编码似乎是一个模棱两可的base 10 编码。例如。据我所知,值{ 1, 10, 255 }{ 110, 255 } 的数组将被编码为相同的:"110255",因此不能明确地改回byte[]

【讨论】:

    【解决方案2】:

    没有任何编码可以实现你想要的。

    你需要像你一样遍历字节。 要使其更快,请使用 StringBuilder 并且不要太频繁地更新 ProgressBar:

    var builder = new StringBuilder();
    
    for (var i = 0; i < fileStream.Length; i++)
    {
        builder.Append(fileStream.ReadByte().ToString());
    
        if (i % 1000 == 0) //update the ProgressBar every 1000 bytes for example
        {
            progressBar.Value = i;
        }
    }
    
    var result = builder.ToString();
    

    【讨论】:

      【解决方案3】:

      好吧,既然你指的是一个字节数组,fileInBytes 真的不能看起来像'1212549878563212450045',而是像这样:

      {byte[22]}
           [0]: 1
           [1]: 2
      
           etc.
      

      如果确实如此,您应该能够使用 StringBuilder 来 fileInString,如下所示:

      StringBuilder sb = new StringBuilder();
      foreach (var b in fileInBytes)
      {
          sb.Append(b.ToString());
      }
      fileInString = sb.ToString();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-15
        • 1970-01-01
        • 2016-01-21
        • 1970-01-01
        • 1970-01-01
        • 2011-01-15
        • 1970-01-01
        相关资源
        最近更新 更多