我有一串十六进制数字,比如说
"010104000202000AC80627061202"
我希望输出为
"01 01 04 00 02 02 00 0A C8 06 27 06 12 02"
我可以使用for循环,但是有没有优化的方法?
我目前正在做的是:
int length = line.Length/2; // Store the length of String
string outputstr = String.Empty;
for (int count = 0; count < length; count++)
{
outputstr += line.Substring(0, 2) + " "; //Get First two bytes and add space
line = line.Substring(2); // Remove those two bytes
}
答案 0 :(得分:4)
您可以使用此正则表达式:
string outputstr = Regex.Replace(inputstr, ".{2}", "$0 ");
答案 1 :(得分:2)
这看起来很简单但也很有效。
private static string DoThat(string input)
{
var sb = new StringBuilder(input.Length);
for (int i = 0; i < input.Length; i += 2)
{
sb.Append(input, i, 2);
sb.Append(" ");
}
return sb.ToString();
}
答案 2 :(得分:1)
因为输出字符串的长度是事先已知的,所以最快的方法是分配最终大小的char[]
,填充它然后return new string(myCharBuffer);
。这也总是被称赞StringBuilder
更快。只需要两个分配,两个分配都具有完美的大小,第二个分配由memcpy
填充。
答案 3 :(得分:1)
如果您希望更快,您可以更改为stringbuilder:
int length = line.Length; // Store the length of String -- see edit below
StringBuilder output = new StringBuilder();
for (int count = 0; count < length; count += 2) // makes more sense to increment the loop by 2
{
output.Append(line.Substring(count, 2) + " "); //Get First two bytes and add space
}
使用Linq进行此操作的一种方法是
string.Join(" ", // join the string collection created below
line.Select((c,i) => new {c,i}) // get each character and its index
.GroupBy(g => g.i/2) // group in pairs
.Select(g => new string(g.Select(ci => ci.c).ToArray())) // convert to char arrays and merge into strings
);
或者
string.Join(" ",
Enumerable
.Range(0, s.Length/2)
.Select(i => s.Substring(i*2, 2))
)
虽然这实质上是在“循环”中调用Substring
所以它可能不是最有效的方法。
答案 4 :(得分:1)
首先,如果要循环并使用字符串操作,请使用Stringbuilder。
这是因为String是不可变的,虽然看起来好像在改变它,但实际上每次迭代都会创建一个新对象并保存在堆栈中。
答案 5 :(得分:1)
如果字符串很大,您可以使用StringBuilder
:
if(line.Length > 100)
{
StringBuilder sb = new StringBuilder(line.Length + line.Length/2);
for(int i=0; i < line.Length; i++)
{
sb.Append(line[i]);
if (i % 2 == 1 && i < line.Length-1)
sb.Append(' ');
}
return sb.ToString();
}
// else your approach
答案 6 :(得分:0)
你可以这样:
var unformatedString = "010104000202000AC80627061202";
var formatedString = Regex.Replace(@"..", "$0 ");
这绝对不是更快,但更容易阅读。