有没有办法将十六进制分数(即:值为< 1.0的数字,以十六进制表示)转换为PowerShell中的十进制等值?
示例:
Hex Dec
0.0858b9da24fb4cac = 0.032603851087498366
0.8c3115559ab0c10b = 0.5476239522928976
我发现一般HEX / DEC转换的指南说使用[Convert]
,这对整数来说很好,但是当我在字符串中抛出一个小数点时它似乎完全失败。
注意:示例来自另一个网站上的数据,这些计算通常都是在这些网站上完成的。我还没有完全验证它们的准确性 - 最后几位可能会有一些错误。幸运的是,无论如何我都没有使用那么多的精确度。
答案 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
}
那应该为你转换分数。