我正在尝试创建一个十六进制到字符串转换器,并且由于某种原因,转换中字节之间的间距乘以2.
我希望它能在字符之间吐出一个空格,
private void button2_Click(object sender, EventArgs e)
{
try
{
textBox1.Clear();
textBox2.Text = textBox2.Text.Replace(" ", "");
string StrValue = "";
while (textBox2.Text.Length > 0)
{
StrValue += System.Convert.ToChar(System.Convert.ToUInt32(textBox2.Text.Substring(0, 2), 16)).ToString();
textBox2.Text = textBox2.Text.Substring(2, textBox2.Text.Length - 2);
textBox1.Text = textBox1.Text + StrValue + " ";
}
}
catch (Exception ex)
{
MessageBox.Show("Conversion Error Occurred : " + ex.Message, "Conversion Error");
}
}
所以" 41 41"转换后看起来像" A A",但这是发生的事情: image 有人看到我做错了吗?
答案 0 :(得分:1)
在这一行
textBox1.Text = textBox1.Text + StrValue + " ";
您因此将计算结果附加到TextBox1
。
因此,在第一次迭代后,结果为A
,您将它和空格追加到TextBox1
。
然后,你拿第二个41
并转换它。现在,StrValue
为AA
,您将其和空格追加到TextBox1
,依此类推。
您需要将此行移出while
循环:
textBox1.Clear();
textBox2.Text = textBox2.Text.Replace(" ", "");
string StrValue = "";
while (textBox2.Text.Length > 0)
{
StrValue += System.Convert.ToChar(System.Convert.ToUInt32(textBox2.Text.Substring(0, 2), 16)).ToString();
textBox2.Text = textBox2.Text.Substring(2, textBox2.Text.Length - 2);
}
textBox1.Text = StrValue;
正如有些人在评论中提到的那样,你需要停止使用TextBox
这种方式。这很令人困惑。您可能希望执行以下操作:
private string HexToString(string hex)
{
string result = "";
while (hex.Length > 0)
{
result += Convert.ToChar(Convert.ToUInt32(hex.Substring(0, 2), 16));
hex = hex.Substring(2); // no need to specify the end
}
return result;
}
然后,在您的按钮点击事件或其他任何地方:
textBox1.Text = HexToString(textBox2.Text.Replace(" ", ""));
就这么简单。或者你甚至可以移动替换方法中的空格。现在,这段代码是可读的,并且在逻辑上是分开的。
答案 1 :(得分:0)
问题似乎是由StrValue
中的累计值引起的。您应该在while内定义该变量,并仅为其分配(不要附加新值)。
while (textBox2.Text.Length > 0)
{
string StrValue = System.Convert.ToChar(System.Convert.ToUInt32(textBox2.Text.Substring(0, 2), 16)).ToString();
textBox2.Text = textBox2.Text.Substring(2, textBox2.Text.Length - 2);
textBox1.Text = textBox1.Text + StrValue + " ";
}