将字节数组转换为分隔字符串

3

我正在尝试将字节数组转换为以逗号分隔的字符串。我只想将字节的值转换为字符串,以便通过TCP向另一台计算机发送字符串。

这是我现在运行的代码,它可以工作,但速度太慢了(字节数组有50000个元素)。你有更好的想法吗?

谢谢。

byte[] bytes = (byte[])dt.Rows[0]["LNL_BLOB"];
string foto="";

foreach (byte b in bytes)
{
   foto = foto + "," + b.ToString();
}

1
这看起来像是一种可怕的方式来完成你正在做的事情。如果你在每个字节文字之间放置逗号,那么你会将每个客户端之间的通信大小加倍。你能解释一下为什么你这样做吗?也许我们可以帮助你找到更好的解决方案来解决你的问题。 - George Johnston
我只需要将一串带有一些数据的字符串发送到正在运行的服务。这个字符串的格式类似于 NAME|LASTNAME|SSNO|PHOTO,其中 PHOTO 是转换为字符串的字节数组。 - NicoRiff
5个回答

7

在进行大量字符串操作时,请使用StringBuilder。在这种特殊情况下,您也可以使用string.Join:

string foto = string.Join(",", bytes);

6

好的,你正在分配100000个字符串(一半来自ToString()调用,一半用于中间字符串)。您从未听说过字符串连接的危险以及StringBuilder的作用吗?

例如:

byte[] bytes = (byte[])dt.Rows[0]["LNL_BLOB"];
System.Text.StringBuilder foto=new System.Text.StringBuilder();

foreach (byte b in bytes)
{
   foto.AppendFormat(",{0}",b);
}
return foto.ToString(); /* Or however you're using your string now */

4
你可以使用Convert.ToBase64String而不是自己遍历字节。
byte[] data = // whatever you do to get the bytes
string sData = Convert.ToBase64String(data);

这里是该方法的文档。

当您想从字符串中获取字节数组时,只需使用Convert.FromBase64String方法即可。

byte[] imageData = Convert.FromBase64String(sData);

只是要注意:这不会产生与原始代码相同的输出。这很好,因为字符串将比逗号分隔的十进制值列表小得多,并且它可以用于“通过TCP将字符串发送到另一台计算机”。 - Justin

1
使用 StringBuilder 进行字符串拼接更加高效。
byte[] bytes = (byte[])dt.Rows[0]["LNL_BLOB"];
StringBuilder foto = new StringBuilder();

for(int i = 0; i < bytes.Length; i++) {
  foto.Append(bytes[i].ToString());

  if (i != (bytes.Length - 1)) foto.Append(",");
}

0
你可以并行化循环,同时处理数组的不同区域,并重新组合结果。而且,正如其他人提到的那样,可以使用 StringBuilder。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接