Strona: [  << <   1   > >>  ]  z  1     
Autor Temat: jak zamienić liczbę single zapisaną w HEX do liczby single wyswietlaną w DEC
anonim




Typ: Nie zarejestrowany
jak zamienić liczbę single zapisaną w HEX do liczby single wyswietlaną w DEC

mam problem wartość single  = (243.75) zapisana w Hex to
"4373C000" i tu zamiana jest  prosta.
ale jak wartość "4373C000" zapisaną w hex zamienić na wartość = 243.75 żeby ją wyświetlić w czytelnej dla człowieka postaci?
Dziękuję za wszelką pomoc
Grzegorz

19-12-2004 10:44
  
HejHo




Typ: neutral
Postów: 66
Zarejestrowany: Apr 2003

spróbuj Val("&H" & liczba)

19-12-2004 10:53
Pokaż profil HejHo  Wyślij email do HejHo        6384729
anonim




Typ: Nie zarejestrowany
już jakaś poprawa

dostałem z tego wynik :1,131659E+09 tylko co dalej z tego zakręcić

19-12-2004 11:07
  
HejHo




Typ: neutral
Postów: 66
Zarejestrowany: Apr 2003
i znowu val

wynik=Val("1,131659E+09"

19-12-2004 12:33
Pokaż profil HejHo  Wyślij email do HejHo        6384729
anonim




Typ: Nie zarejestrowany
Niestety.......

wynik = 1

19-12-2004 13:31
  
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

A jak wyliczyłeś że to jest 243,75 ??


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

19-12-2004 17:20
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
HejHo




Typ: neutral
Postów: 66
Zarejestrowany: Apr 2003

Nie wiem jak tobie wyszło 1, bo mi wychodzi 1131659000. A pozatym Hex(243.75) daje mi F4...

19-12-2004 20:02
Pokaż profil HejHo  Wyślij email do HejHo        6384729
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

no dokładnie mam takie same rezultaty jak HejHo chyba ze zmienna jest typu Single ale i tak nie wychodzi 243,75 tylko 1,...

Do HejHo - to ze ci wychodzi F4 to dlatego ze zaokrąglana jest do 244

[Post edytowany dnia 20-12-2004 00:27 przez DJK]


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

20-12-2004 00:25
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
kicaj




Typ: neutral
Postów: 271
Zarejestrowany: Aug 2003

Koledzy anonim nie bawil sie Microsoft Kalkulator tylko jakim hex edytorem, zapiszcie wartosc binarnie na dysk jako zmienna single potem otworzcie np. w Total Commander i zobaczycie ze jest to 4373C000 (z zamiana bitow)

Anonim odpowiedz na Twoje pytanie :
Hex w VB jest stworzone tylko do liczb calkowitych, tak samo jak kalkulator, musisz poszukac w necie ktore bity w je liczbie odpowiadaja za ulamek a ktore za liczbe calkowita i wtedy masz problem rozwiazany, samemu nie radze tego robic...

20-12-2004 02:00
Pokaż profil kicaj  Wyślij email do kicaj        3914568
karolinavb




Typ: neutral
Postów: 468
Zarejestrowany: Jan 2003

Mam wrażenie, że reprezentacja liczby typu single podana przez anonima jest "heksadecymalną" reprezentacją zawartości 4-ch bajtów na których zapisuje się liczby typu single w VB, czy tak (znak, cecha, mantysa)?.
Może tak (pewnie można prościej, ale jest juz późno, może koledzy usprawnią potem):

Function Przelicz()
' opis podzialu binarnej reprezentacji 4-ch bajtow liczby Single na stronie http://www.i-lo.tarnow.pl/edu/inf/alg/num/pages/14.htm
Dim strhexvalue As String
strhexvalue = "4373C000"
Dim strWynik As String
''' ponizej jest Double bo nie wiedziałam jak mi wyjdzie (czy nie ma "ogonka" prosze zadeklarowac Single
Dim sngWynik As Double
Dim i As Integer
Dim j As Integer
Dim mnoznik As Integer
Dim lngPrzes As Long
Dim strPrzes As String

strWynik = HexToBin(strhexvalue)
'''' obliczamy mnoznik (znak)
mnoznik = IIf(Val(Mid(strWynik, 1, 1)) = 0, 1, -1)
'''' obliczamy wartosc wykladnika przesuniecia
strPrzes = Mid(strWynik, 2, 8)

For i = 8 To 1 Step -1
    If Mid(strPrzes, i, 1) = "1" Then
        lngPrzes = lngPrzes + 2 ^ j
    End If
    j = j + 1
Next
lngPrzes = lngPrzes - 127

j = 23

For i = 10 To 32
Debug.Print sngWynik
    If Mid(strWynik, i, 1) = "1" Then
        sngWynik = sngWynik + (2 ^ (j - 1))
    End If
    j = j - 1
Next
Debug.Print sngWynik
sngWynik = mnoznik * (1 + sngWynik / (2 ^ 23)) * (2 ^ lngPrzes)
MsgBox sngWynik
End Function

Function HexToBin(ByVal Numero As String) As String
Dim Bin, Res As String
  Dim a As Integer
  For a = Val(Len(Numero)) To 1 Step -1
    Select Case Mid(Numero, a, 1)
        Case "0": Bin = "0000"
        Case "1": Bin = "0001"
        Case "2": Bin = "0010"
        Case "3": Bin = "0011"
        Case "4": Bin = "0100"
        Case "5": Bin = "0101"
        Case "6": Bin = "0110"
        Case "7": Bin = "0111"
        Case "8": Bin = "1000"
        Case "9": Bin = "1001"
        Case "A": Bin = "1010"
        Case "B": Bin = "1011"
        Case "C": Bin = "1100"
        Case "D": Bin = "1101"
        Case "E": Bin = "1110"
        Case "F": Bin = "1111"
        Case Else
    End Select
  Res = Bin + Res
Next a
HexToBin = Res
End Function


_____________________________________________
Karolina

20-12-2004 02:09
Pokaż profil karolinavb  Wyślij email do karolinavb   
mailover




Typ: neutral
Postów: 40
Zarejestrowany: Mar 2003

Wielkie dzięki Karolina.
Po dodaniu kilku dodatkowo wymaganych sprawdzeń czy "0" czy "NIESKOŃCZONOŚĆ" procedurka świetna.

Jeszcze jedno pytanie -

czy programowo w vb można przeliczyć wartość dziesiętną na reprezentację hex  w postaci liczby zmienno przecinkowej -  (znak, cecha, mantysa)?, czyli dokładnie odwrotnie.
Kolega "anonim" zapomiał dodać że robimy to "sprzętowo" prz użyciu procesora ATMEL - wysyłamy mu wartość dziesiętnie a on zwraca już w HEX
.
Pozdrawiam

27-12-2004 18:20
Pokaż profil mailover  Wyślij email do mailover   
karolinavb




Typ: neutral
Postów: 468
Zarejestrowany: Jan 2003

Ale nie wiem czy nie ma błędów, zobaczę to jeszcze wieczorkiem, a tymczasem może sam usprawnisz ten kod (0 , niskończoność i zaokrąglenie ? i 126 ???? ). Niektóre funkcje "pożyczyłam z www"

Private Sub Loadbin()
Dim sngLiczba      As Single
Dim strWynik        As String
Dim Poz1            As Integer
Dim Przes          As Integer
Dim tmpCalkowita    As Single
Dim strCalkowita    As String

Dim tmpUlamek      As Single
Dim strUlamek      As String

Dim strLiczba      As String
Dim pozKropka      As Integer

sngLiczba = 0.78125
If sngLiczba = 0 Then
    strWynik = String(32, "0" )
Else
    ''' znak
    strWynik = IIf(sngLiczba < 0, "1", "0" )
   
    sngLiczba = Abs(sngLiczba)
    strLiczba = CStr(sngLiczba)
    Poz1 = InStr(1, CStr(strLiczba), "," )
   
    If sngLiczba > 1 Then
        ''' liczba jest wieksza od 1
        tmpCalkowita = Val(Left(strLiczba, Poz1 - 1))
        tmpUlamek = sngLiczba - tmpCalkowita
       
        strCalkowita = Dec2bin(tmpCalkowita)
        strUlamek = dec2binU(tmpUlamek)
        '''' przesuniecie w lewo
        Poz1 = InStr(1, strCalkowita, "1" )
        Przes = Len(strCalkowita) - Poz1 + 127
        strWynik = strWynik & Dec2bin(Przes, 8) & Mid(strCalkowita, Poz1 + 1) & strUlamek
    Else
        tmpCalkowita = 0
        tmpUlamek = sngLiczba
        strUlamek = dec2binU(tmpUlamek)
        '''' przesuniecie w prawo
        Poz1 = InStr(1, strUlamek, "1" )
        Przes = -Poz1 + 127
        strWynik = strWynik & Dec2bin(Przes, 8) & Mid(strUlamek, Poz1 + 1)
    End If
    If Len(strWynik) < 32 Then
        strWynik = strWynik & String(32 - Len(strWynik), "0" )
    Else
        strWynik = Left(strWynik, 32)
    End If
End If
Debug.Print strWynik
MsgBox Bin2Hex(strWynik)
'''  sprawdzenie Debug.Print Przelicz(Bin2Hex(strWynik))
End Sub

Function Bin2Hex(ByVal BinaryString As String) As String
Dim X As Integer
Const BinValues = "*0000*0001*0010*0011" & _
        "*0100*0101*0110*0111" & _
        "*1000*1001*1010*1011" & _
        "*1100*1101*1110*1111*"
Const HexValues = "0123456789ABCDEF"
If BinaryString Like "*[!01]*" Then
    Bin2Hex = "Error - Argument not a binary string"
Else
    BinaryString = String$((4 - Len(BinaryString) _
            Mod 4) Mod 4, "0" ) & BinaryString
For X = 1 To Len(BinaryString) - 3 Step 4
    Bin2Hex = Bin2Hex & Mid$(HexValues, _
            (4 + InStr(BinValues, "*" & _
        Mid$(BinaryString, X, 4) & "*" ))  5, 1)
Next
End If
End Function

Public Function Dec2bin(mynum, Optional dlug As Variant) As String
Dim Loopcounter As Integer
If mynum >= 2 ^ 31 Then
    Dec2bin = "Number too big"
    Exit Function
End If
Do
    If (mynum And 2 ^ Loopcounter) = 2 ^ Loopcounter Then
        Dec2bin = "1" & Dec2bin
    Else
        Dec2bin = "0" & Dec2bin
    End If
    Loopcounter = Loopcounter + 1
Loop Until 2 ^ Loopcounter > mynum
If Not IsMissing(dlug) Then
    If dlug > 0 Then
        Dec2bin = String(dlug - Len(Dec2bin), "0" ) & Dec2bin
    End If
End If
End Function

Public Function dec2binU(ByVal mynum As Single, _
    Optional ByVal Loopcounter As Integer = 126) As String
If mynum >= 1 Then
    dec2binU = "Number too big"
    Exit Function
End If
Do
    mynum = mynum * 2
    If mynum >= 1 Then
        dec2binU = dec2binU & "1"
        mynum = mynum - 1
    Else
        dec2binU = dec2binU & "0"
    End If
    Loopcounter = Loopcounter - 1
Loop Until Loopcounter = 0 Or mynum = 0
End Function

[Post edytowany dnia 28-12-2004 15:01 przez karolinavb]


_____________________________________________
Karolina

28-12-2004 15:00
Pokaż profil karolinavb  Wyślij email do karolinavb   
mailover




Typ: neutral
Postów: 40
Zarejestrowany: Mar 2003

Dzięki Karolina za pomoc.Niestety nie jest to jeszcze o co mi chodzi.Prześlę ci na maila plik z rozpisanymi warościami z zakresu 0 do 100 w Dec, oraz to co odpowiada temu w HEX. Nie będę umieszczał tego na forum, gdyż jest to około 110 linijek tekstu..
Jeśli mogę Cię prosić to rzuć na to Swoim okiem na ten problem.Pozdrawiam Cię w Nowym 2005 roku .

07-01-2005 16:57
Pokaż profil mailover  Wyślij email do mailover   
karolinavb




Typ: neutral
Postów: 468
Zarejestrowany: Jan 2003

W miarę wolnego czasu poprawiłam, wiecej nie chce zwłaszcza, że specyfikacja pliku jest jak niżej:

Przewtarzanie plików tak skonstruowanych jest meczące, informacje powtarzają się w każdej linii, zmuszją do używania funkcji odczytu nikiego poziomu. Dlaczego nie można organizować plików standardowo (csv  z nagłówkami np.), aby był mozliwy  automatyczny import do Excela, Accessa  lub ADO (Jet 4.0) bez pisania kodu, kilkoma kliknięciami myszką. Przecież niektóre funkcje, jak te tutaj można byłoby wówczas łatwo sprawdzać w Accesie porównując wyniki z zawartym plikiem za pomocą kwerendy (co też zrobiłam, bo nikt nie będzie porównywał linia po linii 110 linijek i jeszcze 2-ch kolumn), a nie tworząc projekt w VB, czasem jest to wygodniejsze .

Tak jest:
"dec =0","w HEX =00000000","w BIN =0000000000000000 0000000000000000"

"dec =0,01","HEX =3C23D70A"," BIN =0011110000100011 1101011100001010"
"dec =0,02","HEX =3CA3D70A"," BIN =0011110010100011 1101011100001010"
"dec =0.03","HEX =3CF5C28F"," BIN =0011110011110101 1100001010001111"


a powinno być raczej zbliżone do postaci jak niżej, po co powtarzać informacje w każdej linii, a i specyfikacja importu jest prosta wówczas:

WDECWHEXWBIN
0,00000000000000000000000000 0000000000000000
0,013C23D70A0011110000100011 1101011100001010
0,023CA3D70A0011110010100011 1101011100001010

Funkcje poprawiłam, dalej poprawiaj sam, "jakby co".

Private Function Loadbin(Optional ByVal sngNewLiczba As Single = 7) As String
Dim sngLiczba      As Single
Dim strWynik        As String
Dim Poz1            As Integer
Dim Przes          As Integer
Dim tmpCalkowita    As Single
Dim strCalkowita    As String

Dim tmpUlamek      As Single
Dim strUlamek      As String

Dim strLiczba      As String
Dim pozKropka      As Integer

'0.78125
sngLiczba = sngNewLiczba
If sngLiczba = 0 Then
    strWynik = String(32, "0" )
Else
    ''' znak
    strWynik = IIf(sngLiczba < 0, "1", "0" )
   
    sngLiczba = Abs(sngLiczba)
    strLiczba = CStr(sngLiczba)
    Poz1 = InStr(1, CStr(strLiczba), "," )
   
    If Abs(sngNewLiczba) >= 1 Then
        ''' liczba jest wieksza od 1
        ' xxxxx
        Select Case Poz1
            Case 0
                '''' brak pozycji dziesiętnej
                tmpCalkowita = Val(strLiczba)
                tmpUlamek = 0
            Case 1
                tmpCalkowita = 0
                tmpUlamek = sngLiczba - tmpCalkowita
            Case Else
                tmpCalkowita = Val(Left(strLiczba, Poz1 - 1))
                tmpUlamek = sngLiczba - tmpCalkowita
        End Select
        strCalkowita = Dec2bin(tmpCalkowita)
        strUlamek = dec2binU(tmpUlamek)
        '''' przesuniecie w lewo
        Poz1 = InStr(1, strCalkowita, "1" )
        Przes = Len(strCalkowita) - Poz1 + 127
        strWynik = strWynik & Dec2bin(Przes, 8) & Mid(strCalkowita, Poz1 + 1) & strUlamek
    Else
        tmpCalkowita = 0
        tmpUlamek = sngLiczba
        strUlamek = dec2binU(tmpUlamek)
        '''' przesuniecie w prawo
        Poz1 = InStr(1, strUlamek, "1" )
        Przes = -Poz1 + 127
        strWynik = strWynik & Dec2bin(Przes, 8) & Mid(strUlamek, Poz1 + 1)
    End If
    If Len(strWynik) < 32 Then
        strWynik = strWynik & String(32 - Len(strWynik), "0" )
    Else
        strWynik = Left(strWynik, 32)
    End If
End If
Loadbin = strWynik
End Function

Function Bin2Hex(ByVal BinaryString As String) As String
Dim x As Integer
Const BinValues = "*0000*0001*0010*0011" & _
        "*0100*0101*0110*0111" & _
        "*1000*1001*1010*1011" & _
        "*1100*1101*1110*1111*"
Const HexValues = "0123456789ABCDEF"
If BinaryString Like "*[!01]*" Then
    Bin2Hex = "Error - Argument not a binary string"
Else
    BinaryString = String$((4 - Len(BinaryString) _
            Mod 4) Mod 4, "0" ) & BinaryString
For x = 1 To Len(BinaryString) - 3 Step 4
    Bin2Hex = Bin2Hex & Mid$(HexValues, _
            (4 + InStr(BinValues, "*" & _
        Mid$(BinaryString, x, 4) & "*" )) \ 5, 1)
Next
End If
End Function

Public Function Dec2bin(mynum, Optional dlug As Variant) As String
Dim Loopcounter As Integer
If mynum >= 2 ^ 31 Then
    Dec2bin = "Number too big"
    Exit Function
End If
Do
    If (mynum And 2 ^ Loopcounter) = 2 ^ Loopcounter Then
        Dec2bin = "1" & Dec2bin
    Else
        Dec2bin = "0" & Dec2bin
    End If
    Loopcounter = Loopcounter + 1
Loop Until 2 ^ Loopcounter > mynum
If Not IsMissing(dlug) Then
    If dlug > 0 Then
        Dec2bin = String(dlug - Len(Dec2bin), "0" ) & Dec2bin
    End If
End If
End Function

Public Function dec2binU(ByVal mynum As Single, _
    Optional ByVal Loopcounter As Integer = 126) As String
If mynum >= 1 Then
    dec2binU = "Number too big"
    Exit Function
End If
Do
    mynum = mynum * 2
    If mynum >= 1 Then
        dec2binU = dec2binU & "1"
        mynum = mynum - 1
    Else
        dec2binU = dec2binU & "0"
    End If
    Loopcounter = Loopcounter - 1
Loop Until Loopcounter = 0 Or mynum = 0
End Function

Function Przelicz(ByVal strhexvalue As String) As Single
' opis podzialu binarnej reprezentacji 4-ch bajtow liczby Single
' na stronie http://www.i-lo.tarnow.pl/edu/inf/alg/num/pages/14.htm
Dim strWynik As String
''' ponizej jest Double bo nie wiedziałam jak mi wyjdzie
''' (czy nie ma "ogonka" prosze zadeklarowac Single
Dim sngWynik As Double
Dim i As Integer
Dim j As Integer
Dim mnoznik As Integer
Dim lngPrzes As Long
Dim strPrzes As String
If strhexvalue <> String(8, "0" ) Then
    strWynik = HexToBin(strhexvalue)
    '''' obliczamy mnoznik (znak)
    mnoznik = IIf(Val(Mid(strWynik, 1, 1)) = 0, 1, -1)
    '''' obliczamy wartosc wykladnika przesuniecia
    strPrzes = Mid(strWynik, 2, 8)
   
    For i = 8 To 1 Step -1
        If Mid(strPrzes, i, 1) = "1" Then
            lngPrzes = lngPrzes + 2 ^ j
        End If
        j = j + 1
    Next
    lngPrzes = lngPrzes - 127
    j = 23
    For i = 10 To 32
        If Mid(strWynik, i, 1) = "1" Then
            sngWynik = sngWynik + (2 ^ (j - 1))
        End If
        j = j - 1
    Next
    sngWynik = mnoznik * (1 + sngWynik / (2 ^ 23)) * (2 ^ lngPrzes)
    Przelicz = sngWynik
Else
    Przelicz 0
End If
End Function

Function HexToBin(ByVal Numero As String) As String
Dim Bin, res As String
  Dim a As Integer
  For a = Val(Len(Numero)) To 1 Step -1
    Select Case Mid(Numero, a, 1)
        Case "0": Bin = "0000"
        Case "1": Bin = "0001"
        Case "2": Bin = "0010"
        Case "3": Bin = "0011"
        Case "4": Bin = "0100"
        Case "5": Bin = "0101"
        Case "6": Bin = "0110"
        Case "7": Bin = "0111"
        Case "8": Bin = "1000"
        Case "9": Bin = "1001"
        Case "A": Bin = "1010"
        Case "B": Bin = "1011"
        Case "C": Bin = "1100"
        Case "D": Bin = "1101"
        Case "E": Bin = "1110"
        Case "F": Bin = "1111"
        Case Else
    End Select
  res = Bin + res
Next a
HexToBin = res
End Function

Sorry za uwagi, ale po co utrudniać sobie życie..
A tak z czysto babskiej ciekawości, po co jest ?


_____________________________________________
Karolina

11-01-2005 22:50
Pokaż profil karolinavb  Wyślij email do karolinavb   
karolinavb




Typ: neutral
Postów: 468
Zarejestrowany: Jan 2003

Mailover to Ty jesteś anonimem ? A ładnie to tak ?


_____________________________________________
Karolina

11-01-2005 22:53
Pokaż profil karolinavb  Wyślij email do karolinavb   
mailover




Typ: neutral
Postów: 40
Zarejestrowany: Mar 2003

Hej Karolina.
Niestety nie mam stałego dostępu do internetu, wówczas kolega za mnie umieszcza to o co go proszę.
Wówczas się nie loguje i wyświetla się anonim.
Niestety dopiero dzisiaj udało mi się dostać do internetu.
Serdeczne dzięki za pomoc w programie.
Udało mi się to uruchomić.
Pozdrawiam Cię.

21-01-2005 15:16
Pokaż profil mailover  Wyślij email do mailover   
karolinavb




Typ: neutral
Postów: 468
Zarejestrowany: Jan 2003

Mailover, ja tak bez "czepiania" tak sobie tylko
Pozdrowienia...


_____________________________________________
Karolina

21-01-2005 19:20
Pokaż profil karolinavb  Wyślij email do karolinavb   
Wszystkich odpowiedzi: 16 :: Maxymalnie na stronę: 20
Strona: [  << <   1   > >>  ]  z  1