ďťż

89343_1

Lemur zaprasza

Strona: [  >  ]  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



 
      

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



 
      

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



 
    














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



 
      

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



 
    














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



 
      

3914568














karolinavb







Typ:
neutral

Postów: 467

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



 
  














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



 
  














karolinavb







Typ:
neutral

Postów: 467

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



 
  














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



 
  














karolinavb







Typ:
neutral

Postów: 467

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



 
  














karolinavb







Typ:
neutral

Postów: 467

Zarejestrowany: Jan 2003







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



_____________________________________________
Karolina






11-01-2005 22:53



 
  














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



 
  














karolinavb







Typ:
neutral

Postów: 467

Zarejestrowany: Jan 2003







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



_____________________________________________
Karolina






21-01-2005 19:20



 
  













Wszystkich odpowiedzi: 16 :: Maxymalnie na stronę: 20










Strona: [  >  ]  z  1     
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • teen-mushing.xlx.pl
  • Wątki
    Powered by wordpress | Theme: simpletex | © Lemur zaprasza