2016-08-01 10 views
3

Gibt es eine Möglichkeit, hexadezimale Brüche (d. H. Zahlen mit Werten < 1.0, dargestellt in hex) in ihre Dezimaläquivalente in PowerShell zu konvertieren?Wie kann ich Hexadezimalbruch in PowerShell in Dezimal konvertieren?

Beispiele:

Hex     Dec 
0.0858b9da24fb4cac = 0.032603851087498366 
0.8c3115559ab0c10b = 0.5476239522928976 

Guides I für allgemeine HEX/DEC Umwandlung gefunden habe, sagen [Convert], zu verwenden, die für ganze Zahlen in Ordnung ist, aber es scheint, völlig zu versagen, wenn ich ein Komma in der throw Zeichenfolge.

Hinweis: Beispiele wurden aus Daten an einem anderen Standort entnommen, wo diese Berechnungen routinemäßig durchgeführt werden. Ich habe ihre Genauigkeit nicht vollständig überprüft - in den letzten paar Ziffern ist möglicherweise ein Fehler aufgetreten. Glücklicherweise werde ich sowieso nicht so viel Präzision verwenden.

Antwort

4

Ich weiß nicht von einem eingebauten .Net Weg, es zu tun. Ich schrieb diesen Brute-Force-Konverter, aber Ihre Werte scheinen nicht genau mit .Net-Typ-Präzision übereinstimmen - [double] (64bit) ist zu niedrig Präzision, und [decimal] (128bit) ist mehr.

Ihre Beispiele kommen etwa so:

0.0858b9da24fb4cac = 0.032603851087498366 
        = 0.0326038510874983682928164128 

0.8c3115559ab0c10b = 0.5476239522928976 
        = 0.5476239522928976344718082711 

Code:

<# 
.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: Hinweis zur Genauigkeit der Beispiele hinzugefügt. – Iszi

2

Ok, fing dieses mein Interesse. Ich wusste nicht einmal, dass hexadezimale Brüche eine Sache waren, also ging ich und schaute nach. Konvertieren ist nicht in den [math] oder [convert] Bibliotheken, die ich sehen kann, abgedeckt, so dass wir eine Funktion schreiben müssen, die sich darum kümmert. Ich habe das geschrieben, und es ist relativ genau, aber Sie müssen bedenken, dass ein Bruchteil so klein wie Sie es haben, es wird eine Rundung geben ... Ich meine wirklich, für Ihr erstes Beispiel haben Sie sogar gerundet. Die letzte Ziffer allein ist etwas wie 6.50521303491303E-19 (das ist 12 * (16^-16)).

Also, diese Funktion wie folgt aussieht:

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 
} 

Das Ihre Fraktionen für Sie konvertieren soll.

+0

* Ich wusste nicht einmal, dass hexadezimale Brüche ein Ding waren * - Deshalb haben wir 2016 immer noch keine schönen Bibliotheksroutinen, um mit diesem Zeug umzugehen! Ich scherze, aber ... Sie verstehen, was ich meine. ;) – alzee

+0

FYI: Eine Anmerkung über die Genauigkeit der Beispiele zu der Frage hinzugefügt. – Iszi

Verwandte Themen