2

我有一个byte[],我想提取数组的一部分并将其转换为字符串。我想使用 LINQ 并在一行中完成。这是我能找到的最好的,但它让我失望了。

String id = new String(payload.Skip(60).Take(92-60+1).ToString());

将有效载荷[60]提取到有效载荷[92]并将其转换为字符串。有没有更好的办法?而且我仍然遇到这种语法的一些错误..

4

5 回答 5

1

不需要 linq。ASCIIEncoding.GetString

var str = Encoding.ASCII.GetString(payload, 60, 92-60+1);
于 2012-11-05T09:10:21.620 回答
0

您可以尝试以下操作:

string.Concat((object[])payload.Skip(60).Take(92-60+1).Cast<object>().ToArray())
于 2012-11-05T08:58:32.600 回答
0

试试这个。

String id =Encoding.ASCII.GetString(payload.ToArray().Skip(60).Take(92-60+1).ToArray())
于 2012-11-05T08:59:06.267 回答
0

假设一个 UTF8 编码的字符串,你可以像这样使用 linq:

Encoding.UTF8.GetString(bytes.Skip(60).Take(32).ToArray());

一个更直接有效的解决方案是:

Encoding.UTF8.GetString(bytes, 60, 32);

这避免了复制数组的部分,并且用秒表快速检查显示它快了 20 倍。

于 2012-11-05T08:59:56.930 回答
0

首先,您应该使用一些编码将您的字节数组转换为字符串(在我看来,与将字节数组转换为字符串的其他方法相比,这是一种安全的方法),并且这种编码取决于您的字节数组格式,并且您更了解它。

其次,因为你有一个数组,所以最好使用内置的数组函数Array.Copy,因为这比 linq 更快,而且你不需要遍历数组的 92 个元素,你只需要遍历 33 个元素。

var secondArray = new byte[92-60+1];
Array.Copy(payLoad, 60, secondArray, 0, 92-60+1);
UTF8Encoding encoding = new UTF8Encoding();
string result = encodin.GetString(secondArray);
于 2012-11-05T09:15:56.753 回答