乌龙.解析(字符串,数字样式)异常 C#
本文关键字:样式 异常 数字 解析 字符串 乌龙 | 更新日期: 2023-09-27 18:36:02
我一直在研究这种"字符串到二进制"方法的时间比平时更长,我不知道我哪里出错了。
我已经在互联网上搜索了解决方案,但似乎没有任何工作要做。
public static string hexToBin(string strValue)
{
byte[] hexThis = ASCIIEncoding.ASCII.GetBytes(strValue.ToString());
string thiI = ToHex(strValue);
ulong number = UInt64.Parse(*string*, System.Globalization.NumberStyles.HexNumber);
byte[] bytes = BitConverter.GetBytes(number);
string binaryString = string.Empty;
foreach (byte singleByte in bytes)
{
binaryString += Convert.ToString(singleByte, 2);
}
return binaryString;
}
ToHex(string) 采用字符串并返回其十六进制表示形式。
但我不断得到的只是"输入字符串格式不正确"。解析(字符串,数字样式);无论我的输入是什么,我都会不断收到"格式异常"输入字符串格式不正确"。错误。
输入及其输出
- 字符串:格式异常 - "你好"
- 十六进制:格式异常 - "48 65 6C 6C 6F"
- byte[]:格式异常 - { 72, 101, 108, 108, 111 }
- 我也尝试使用"Hello"字符串,但它给我带来了同样的错误。
你能告诉我我在这里做错了什么吗?我也尝试过"清理/构建/重建"重新启动Visual Studio,但我不断收到相同的格式异常。
编辑,,使用 UInt64.Parse() 不长。Parse() 并且使用的字符串是 "Hello" 不带引号。
编辑#2,,
所以我根据 knittl 的建议这样做并使用 Convert.ToUInt64 而不是解析,但仍然收到相同的错误
ulong binary;
string binThis;
byte[] ByteThis;
binThis = "Hello";
ByteThis = ASCIIEncoding.ASCII.GetBytes(binThis);
binary = Convert.ToUInt64(ByteThis);
Console.WriteLine(binary);
当前文化设置为en-US,我也使用en-US键盘
编辑 #3 - 已解决
感谢 Knittl
解决方案如下:
string thestring = "example";
string[] finale = new string[thestring.Length];
foreach (var c in ByteThis)
{
for (int i = 0; i < ByteThis.Length; i++)
{
thestring = Convert.ToString(c, 2);
thestring = "0" + thestring;
if (thestring.Length == 9)
thestring.Remove(0, 1);
finale[i] = thestring;
Console.WriteLine(finale[i]);
}
}
最后一个是检查解决方案。
这个问题旨在获取给定字符串的二进制表示形式。
不完全清楚,你的方法应该做什么(即输入字符串的格式是什么。它是 bas10 数字,还是已经是十六进制数字?
如果是十六进制数,请使用 ulong.Parse(inputStr, NumberStyles.HexNumber)
。如果没有,只需使用 ulong.Parse(inputStr)
.请注意,NumberStyles.HexNumber
不允许使用0x
前缀(但是Convert.ToUInt64(inputStr)
允许)。
然后,一旦将输入字符串解析为数字,只需使用 Convert.ToString(number, 2)
转换为 base2。你会注意到没有需要ulong
和int
的重载,但你可以简单地将你的数字转换为(有符号的)长,因为二进制表示在两者之间是相同的(参见二的补码)。所以,实际上Convert.ToString((long)number, 2)
.
无需复杂的循环和转换为字节数组。
奖励答案。
如果您不太关心性能,甚至可以使用 LINQ 单行代码:
Encoding.ASCII.GetBytes(inputStr).Aggregate(
new StringBuilder(),
(sb, ch) => sb.Append(Convert.ToString(ch, 2).PadLeft(8, '0')),
sb => sb.ToString());