ďťż
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 |