Int*_*eXX -6 c# vb.net binary type-conversion
我整理了一些扩展方法,用于将数字值转换为它们的二进制等效项。
但是我遇到了一个问题。
我们可以使用Convert.ToString()重载将这些类型转换为二进制:
Byte
Short
Integer
Long
Run Code Online (Sandbox Code Playgroud)
例如:
Dim iInteger As Integer
Dim sBinary As String
iInteger = Integer.MaxValue
sBinary = Convert.ToString(iInteger, 2)
Run Code Online (Sandbox Code Playgroud)
但是Single接受基值并没有过载。单参数重载返回科学计数法,而不是二进制值。
我试过了这段代码,改编自以下答案:
Public Function ToBinary(Value As Single) As String
Dim aBits As Integer()
Dim _
iLength,
iIndex As Integer
Select Case Value
Case < BitLengths.BYTE : iLength = 7
Case < BitLengths.WORD : iLength = 15
Case < BitLengths.DWORD : iLength = 31
Case < BitLengths.QWORD : iLength = 63
End Select
aBits = New Integer(iLength) {}
For iIndex = 0 To iLength
aBits(iLength - iIndex) = Value Mod 2
Value \= 2
Next
ToBinary = String.Empty
aBits.ForEach(Sub(Bit)
ToBinary &= Bit
End Sub)
End Function
Run Code Online (Sandbox Code Playgroud)
但是,不幸的是,它返回的结果不准确:
Input: 1361294667
Result: Assert.AreEqual failed. Expected:<01010001001000111011010101001011>. Actual:<01010001001000111011010110000000>.
Run Code Online (Sandbox Code Playgroud)
我们可以从旧的Windows 7计算器的Programmer View中获得期望值:
鉴于这些,我们如何可靠地将Single值转换为二进制字符串?
- 编辑 -
我发现以下语句:“没有精确的二进制表示形式0.1或0.01。” 这几乎说明了一切。我已经决定放弃这一点,因为很明显,这种努力是徒劳的。
您提供的示例期望值只是数字的直接二进制表示形式,但是,如果您想以二进制形式获取IEEE-754的数字表示形式,则可能不是最有效的方法,可以BitConverter.GetBytes在以下示例中使用:
Sub Main
Dim i As Int32 = 1361294667
Console.WriteLine(ObjectAsBinary(i))
Dim s As Single = 1361294667
Console.WriteLine(ObjectAsBinary(s))
End Sub
Private Function ObjectAsBinary(o As Object) As String
Dim bytes = BitConverter.GetBytes(o)
If BitConverter.IsLittleEndian Then
Array.Reverse(bytes)
End If
Dim result As String = ""
For Each b In bytes
result &= Convert.ToString(b, 2).PadLeft(8, "0")
Next
Return result
End Function
Run Code Online (Sandbox Code Playgroud)
该代码输出以下内容:
01010001001000111011010101001011 -符合您的示例
01001110101000100100011101101011-匹配来自IEEE-754浮点转换器的IEEE-754