Strona: [  << <   1   > >>  ]  z  1     
Autor Temat: Konwersja liczby BIN
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004
Konwersja liczby BIN

Witam

Z rejestru odczytałem liczbę zapisaną binarnie

"00 00 00 08" gdzie jak wiadomo pary 00 to jeden bajt

Każdy bajt zapisałem do tablicy.

W jaki sposób uzyskać z tego wartość 128 - tak w rejestrze pod XP jest zapisany rozmiar pamięci karty graficznej

Dla ciągu "00 00 00 04" jest 64 MB

Wydaje mi się że związane jest to z pozycją
jedynki czyli 0100 (4) i 1000 * (8)

poza tym jak określić na jakim bicie jest jedynka

[Post edytowany dnia 10-12-2004 16:19 przez DJK]


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

10-12-2004 16:09
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
bisiek




Typ: neutral
Postów: 487
Zarejestrowany: Jul 2003

Pozycję jedynki można określić poleceniem and np.
if liczba and 4 then ...
Myślę, że może to być  wynik * 16, ale to tylko przypuszczenie.


_____________________________________________
www.mob.abc.pl - moja strona o VB

11-12-2004 08:37
Pokaż profil bisiek  Wyślij email do bisiek   Odwiedź stronę bisiek       3380672
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

To nie jest zapis binarny, tylko szesnastkowy - i już po problemie .


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

11-12-2004 10:10
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
DJK



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

W tym przypadku nie ma większego znaczenia czy jest to zapis binarny czy szesnastkowy szczegółnie ze żadna z wartości nie przekracza 9

iPower = 1
    While (2 ^ iPower) < 8
        iPower = iPower + 1
    Wend
    iPower = iPower + 4
    GetVideoMemory = 2 ^ iPower

Ten kod jest, że tak powiem trochę "naiwny" - ktoś ma jakiś inny pomysł ??

Ta ósemka to ta wartość z rejestru

[Post edytowany dnia 11-12-2004 11:15 przez DJK]


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

11-12-2004 11:09
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

Ale ja nadal nie rozumiem w czym problem . Jest zwykła to wartość zapisana szesnastkowo. Wystarczy ją poprostu zamienić na zapis dziesiętny czy zapisać w zmiennej liczbowej.
00 00 00 04 = 67108864 (67108864 bajty = 64MB)
00 00 00 08 = 134217728 (134217728 bajty = 128MB)
itd...


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

11-12-2004 11:45
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
DJK



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

Nie mam pojęcia w jaki ty sposób uzyskałeś te liczby - możesz wyjaśnić ??

Nie no spoko kapuję - tylko że muszę to odwrócić ok

tylko że jak mam każdy bajt w tablicy oddzielnie to jak zapisać to do jednej zmiennej żeby zamienić na Decimal

Sorki za takie głupie pytania ale nigdy nie miałem potrzeby konwertowania liczb w różnych zapisach

[Post edytowany dnia 11-12-2004 12:38 przez DJK]


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

11-12-2004 12:34
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
DJK



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

Jak dodać te 3 zero bo zwraca 8000


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

11-12-2004 12:53
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

Aha. No to od początku:
To jest zapis big-endian. Najbardziej znaczący bajt znajduje się na końcu (patrząc od lewej). Potem kolejne i na początku najmniej znaczący.

W przyładzie 00 00 00 04, oznacza to, że tyle, że w klasycznym zapisie, miałoby to wartość:
0x4000000.

Musisz zamieniać bajty licząc od tyłu. Proponuję użyć funkcji Split z parametrem delimeter = " " i stworzyć przy jej pomocy tablicę (będzie miała 4 elementy). Potem zamienić miejscami te elementy i całość wsadzić do jakiejś funkcji zamieniajacej zapis hex na liczbę. Druga metoda - idąc od końca pobierać wartosci kolejnych elementów i potem je pomnożyć i zsumować:
16^3*A + 16^2*B + 16*C + D, gdzie A,B,C,D to kolejne elementy tablicy.


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

11-12-2004 12:54
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
DJK



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

Problem w tym ze nie można użyć Split bo to nie jest string "00 00 00 04"

Nadal sie nie rozumiemy

Powiedzmy że mam tablicę:

Tablica(0 To 3) As Byte

Tablica(0) = &H00
Tablica(1) = &H00
Tablica(2) = &H00
Tablica(3) = &H08

'Tak to niby wygląda

Uzyskaj z tej tablicy te 128 MB

Chodzi mi o te 6 zer + ta 8

tablica zwróci ci tylko 3 zera bo tak w rzeczywistości jest a zapis &H00 to "to samo" co &H0

Mam nadzieję że wiesz teraz o co chodzi

[Post edytowany dnia 11-12-2004 13:13 przez DJK]


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

11-12-2004 13:07
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
DJK



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

Może funkcja Format - co o tym myślisz ?

np. Format (&H0,"00"

Kurde tylko że wtedy będzie o jedno zero za dużo

[Post edytowany dnia 11-12-2004 13:23 przez DJK]


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

11-12-2004 13:18
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

No to jeśli masz tablicę z wartościami, to wręcz wspaniale, bo masz właściwie gotową wartość .

Teraz tylko użyj takiego kodu:
wynik = Tablica(3)*16777216 + Tablica(2)*65536 + Tablica(1)*256 + Tablica(0)

i powinieneś mieć wartość, któej szukasz - w postaci liczby bajtów pamięci karty graficznej. Żeby to potem zamienić na megabajty podziel to przez 1048576 i już .

Druga metoda to skopiować kolejne wartości do odpowiednich bajtów w zmiennej Long, ale w odwrotnej kolejności - np. funkcją CopyMemory.

Obie metody powinny działać, a jeśli nie chcesz się bawić w kopiowanie pamięci, to pierwsza będzie lepsza.

[Post edytowany dnia 11-12-2004 14:52 przez marcin_an]


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

11-12-2004 14:50
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
DJK



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

Wielkie dzięki - co tak długo

Trochę zmodyfikoałem to dla dowolnej tablicy

For X = 0 To UBound(bArray)
        sMemory = sMemory + (bArray(X) * (256 ^ X))
Next X

sMemory = sMemory/(1024^2)

Pozdrawiam


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

11-12-2004 15:17
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

Z tym, że do wartości z rejestru radzę ci jednak uzywać wcześniejszego kodu - działa znacznie szybciej, a przecież tablica i tak zawsze będzie miała 4 elementy


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

11-12-2004 15:50
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
DJK



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

Wolę się zabezpieczyć - nie dostałem odpowiedzi odnośnie zapisu w HEX dla kart 256 MB i 32

ale myślę że dla 32 będzie "2" a dla 256 "A"


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

11-12-2004 16:23
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

Ale nie ma się przed czym zabezpieczać - przecież wartości większych niż 32-bitowych nie powinieneś dostać - przynajmniej dla kart do niemalże 4GB .

Dla  32MB: 00 00 00 02
Dla  64MB: 00 00 00 04
Dla 128MB: 00 00 00 08
Dla 256MB: 00 00 00 10
Dla 512MB: 00 00 00 20
Dla  1GB: 00 00 00 40
Dla  2GB: 00 00 00 80
Dla  ~4GB: FF FF FF FF

Ale z drugiej strony - to pewnie będzie wykonywane raz, więc znowu taka straszna optymalizacja nie jest potrzebna.


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

11-12-2004 16:31
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
DJK



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

no niby tyle że nie jestem pewien czy oby na pewno rozmiar karty 256MB jest zapisany "00 00 00 10"

Tego nie wiem dlatego chciałem się dowiedzieć ale tu chyba nikt nie ma 256 i 32


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

11-12-2004 16:54
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

Ja mam w szafie różne modele - od 1024kB (tj. 512kB z możliwością rozbudowy - dla tych, którzy chcą mieć super-sprzęt ) do 32MB. Ale niestety w szafie, a ze względu na to, ze u mnie się na GF ledwo wiatraczek trzyma - wolałbym go nie wyciągać.

Natomiast sądzę, że tak właśnie jest... wygląda na to, że tam jest poprostu podany rozmiar pamieci w bajtach.


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

11-12-2004 17:01
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
DJK



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

skoro tak mówisz


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

11-12-2004 17:18
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
Wszystkich odpowiedzi: 17 :: Maxymalnie na stronę: 20
Strona: [  << <   1   > >>  ]  z  1