我一直在研究这种“字符串到二进制”的方法比平时更长,我不知道我哪里出错了。
我已经在互联网上寻找解决方案,但似乎没有按照预期的方式工作。
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)接受字符串并返回其十六进制表示。
但我不断得到的是“输入字符串格式不正确”。在ulong.Parse(string,NumberStyle);并且无论我的输入是什么,我都会得到“FormatException”“输入字符串的格式不正确。”错误。
输入及其输出
编辑,使用UInt64.Parse()而不是ulong.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);
CurrentCulture设置为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]);
}
}
最后的决定是检查解决方案。
这个问题旨在获得给定字符串的二进制表示。
答案 0 :(得分:1)
不完全清楚,你的方法应该做什么(即输入字符串是什么格式。是bas10号码,还是十六进制数?)
如果它是十六进制数字,请使用ulong.Parse(inputStr, NumberStyles.HexNumber)
。如果没有,只需使用ulong.Parse(inputStr)
即可。请注意,NumberStyles.HexNumber
不允许使用0x
前缀(Convert.ToUInt64(inputStr)
)。
然后,一旦您将输入字符串解析为数字,只需使用Convert.ToString(number, 2)
转换为base2。您会注意到没有重载需要ulong
和int
,但您可以简单地将您的数字转换为(签名)长,因为二进制表示在两者之间是相同的(cf两个补充)。所以,实际上是Convert.ToString((long)number, 2)
。
无需复杂的循环和转换为字节数组。
答案 1 :(得分:0)
奖金回答。
如果你不太关心性能,你甚至可以使用LINQ one-liner:
Encoding.ASCII.GetBytes(inputStr).Aggregate(
new StringBuilder(),
(sb, ch) => sb.Append(Convert.ToString(ch, 2).PadLeft(8, '0')),
sb => sb.ToString());