如何在PowerShell中将十六进制小数转换为十进制?

时间:2016-08-01 21:23:19

标签: powershell numbers

有没有办法将十六进制分数(即:值为< 1.0的数字,以十六进制表示)转换为PowerShell中的十进制等值?

示例:

Hex                  Dec
0.0858b9da24fb4cac = 0.032603851087498366
0.8c3115559ab0c10b = 0.5476239522928976

我发现一般HEX / DEC转换的指南说使用[Convert],这对整数来说很好,但是当我在字符串中抛出一个小数点时它似乎完全失败。

注意:示例来自另一个网站上的数据,这些计算通常都是在这些网站上完成的。我还没有完全验证它们的准确性 - 最后几位可能会有一些错误。幸运的是,无论如何我都没有使用那么多的精确度。

2 个答案:

答案 0 :(得分:4)

我不知道内置的.Net方式。我写了这个暴力转换器,但你的价值似乎与.Net类型精确度完全匹配 - [double](64位)精度太低,[decimal](128位)是更多。

您的示例如下:

0.0858b9da24fb4cac = 0.032603851087498366
                   = 0.0326038510874983682928164128

0.8c3115559ab0c10b = 0.5476239522928976
                   = 0.5476239522928976344718082711

代码:

<#
.Synopsis
   Converts strings containing hexadecimal numbers with fractional components
   into base-10 [decimal] numbers.

.EXAMPLE

   PS C:\> ConvertFrom-HexFraction '0.0858b9da24fb4cac'
   0.0326038510874983682928164128

.Example

   PS C:\> '0.0858b9da24fb4cac', '0.8c3115559ab0c10b' | ConvertFrom-HexFraction
   0.0326038510874983682928164128
   0.5476239522928976344718082711
#>
function ConvertFrom-HexFraction
{
    [CmdletBinding()]
    [OutputType([decimal])]
    Param
    (
        [Parameter(Mandatory=$true,
                   ValueFromPipeline=$true)]
        [string]$hexValue
    )

    Process
    {
        # strip leading hex indicator, setup result placeholder of desired type.
        $hexValue = $hexValue -replace '^(0x|&h)'
        $result = [decimal]0

        # Loop over the digits (hexits?) in the string, skip the (hexa)decimal point '.'
        # and calculate (value * base ^ columnNum) for each.

        $i = $hexValue.IndexOf('.') - 1
        [char[]]$hexValue | Where { $_ -ne '.' } | ForEach {

            $result += [convert]::ToInt32($_, 16) * [Math]::Pow(16, $i--)

        }

        $result #output the result
    }

}


ConvertFrom-HexFraction '0.0'
ConvertFrom-HexFraction 'a.a'
ConvertFrom-HexFraction '0.0858b9da24fb4cac'
ConvertFrom-HexFraction '0.8c3115559ab0c10b'
'0.0858b9da24fb4cac', '0.8c3115559ab0c10b' | ConvertFrom-HexFraction 

答案 1 :(得分:2)

好的,这个引起了我的兴趣。我甚至不知道十六进制分数是一个东西,所以我去查找它。转换它们不在我能看到的[math][convert]库中,因此我们必须编写一个为我们处理它的函数。我写了这个,而且它相对准确,但是你必须考虑到你所拥有的一小部分会有一些四舍五入...我的意思是真的,对于你的第一个例子,即使是你的四舍五入。最后一个数字就像6.50521303491303E-19(12 *(16 ^ -16))。

所以,该功能看起来像:

Function HexToInt([string]$TextIn){
$Pre,$Post = $TextIn.split('.')

$PostConverted = For($i=1;$i -le $Post.Length;$i++){
    [convert]::ToInt32($Post[($i-1)],16) * [math]::pow(16,($i*-1))
}
$PostSum = $PostConverted | Measure-Object -Sum |% Sum
$Int = [convert]::ToInt64($Pre,16)
$Int+$PostSum
}

那应该为你转换分数。