2016-08-01 45 views
3

PowerShellでは、16進数(つまり、値が<の数字を16進数で表した数値)を10進数に変換する方法はありますか?PowerShellで16進数を10進数に変換するにはどうすればよいですか?

例:私は、一般的なHEX/12月の変換のために見つけた

Hex     Dec 
0.0858b9da24fb4cac = 0.032603851087498366 
0.8c3115559ab0c10b = 0.5476239522928976 

ガイドは全体の数字の罰金です[Convert]を、使用することを言うが、私が小数点を投げる時に完全に失敗しているようです文字列。

注:例は、これらの計算が日常的に行われる別のサイトのデータから取られました。私はその正確さを完全には検証していません - 最後の数桁に何らかのエラーがあるかもしれません。幸いにも、私はとにかくその多くの精度を使用しません。

答えて

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 
+0

FYI:質問の例の精度に関する注意を追加しました。 – Iszi

2

は、[OK]を、これは私の興味を引きました。私は16進数が分かったことさえ知りませんでしたので、私は行って調べました。それらを変換することは、私が見ることができる[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 
} 

+0

*私は16進数が分かったことさえ知りませんでした* - これが2016年にはまだこのようなことを処理するライブラリルーチンがありません!私は子供だけど..あなたは私のポイントを得る。 ;) – alzee

+0

FYI:質問の例の精度に関する注釈を追加しました。 – Iszi

関連する問題