2013-04-02 9 views
7

Poproszono mnie o przekonwertowanie liczb całkowitych na 32-bitowe liczby binarne. Tak więc jest używany integer.toString(2) i uzyskał wymaganą wartość w 32-bitowym formacie binarnym 0 i 1's. Ale faktycznie to, o co mnie poproszono, to przekonwertowanie liczby całkowitej na 4 bajty danych. Nie mogę uzyskać wyników zgodnie z sugestią. Użyłem integer.toString(8), integer.toString(16). ale bezużyteczne.Konwersja 32-bitowej liczby całkowitej na 4 bajty danych w javascript

Przykład:

num=1065489844 
num.toString(2) //Output: 111111100000100001010110110100 
num.toString(8) //Output: 7740412664 

Proszę dać mi znać, gdzie jestem brakuje.

+3

Struny nie są zwykle takie same jak dane binarne . Gdybyś mógł użyć bazy z 256, byłyby one takie same, ale 'toString()' obsługuje tylko bazy do 36. – unwind

+3

Jakie ma być wyjście? Nie jest jasne, jak powinno wyglądać zamierzone 4 bajty wyjściowe? – jfriend00

+1

Powiedzmy, że twoja liczba całkowita jest zapisana w zmiennej 'x'. Następnie użyj 'x | 0' zapewnia, że ​​jest to 32-bitowa liczba całkowita. Nie mam pojęcia, co masz na myśli przez "liczbę binarną". Każda liczba całkowita w każdym języku programowania jest przechowywana jako bity. –

Odpowiedz

1

jeśli potrzebujesz wyjścia w formacie szesnastkowym, tutaj jest kod.

/* Convert value as 8-bit unsigned integer to 2 digit hexadecimal number. */ 

function hex8(val) { 
    val &= 0xFF; 
    var hex = val.toString(16).toUpperCase(); 
    return ("00" + hex).slice(-2); 
} 

/* Convert value as 16-bit unsigned integer to 4 digit hexadecimal number. */ 

function hex16(val) { 
    val &= 0xFFFF; 
    var hex = val.toString(16).toUpperCase(); 
    return ("0000" + hex).slice(-4); 
} 

/* Convert value as 32-bit unsigned integer to 8 digit hexadecimal number. */ 

function hex32(val) { 
    val &= 0xFFFFFFFF; 
    var hex = val.toString(16).toUpperCase(); 
    return ("00000000" + hex).slice(-8); 
} 


var num = 1065489844; 
console.log("0x" + hex32(num)); // will output 0x3F8215B4 
+0

Co zrobiłem, użyłem 'num.tostring (2)' i wysłałem wartość do pliku tekstowego, a po obserwacji okazało się, że rozmiar pliku tekstowego wynosi 32 bajty, ale nie 4 bajty. Tak więc, jak wspomniałem przez @unwind, muszę użyć bazy 256. Proszę, niech ktoś mi powie, jak użyć bazy 256, aby uzyskać rzeczywistą liczbę binarną. – user1647017

+0

Musisz zapisać swoje dane jako pliki binarne (nie jako ASCII), więc rozmiar pliku będzie wynosił 4 bajty. – Bechir

+0

Poniższy kod umożliwia pobranie pliku zawierającego twoją liczbę w formacie binarnym. Rozmiar pliku będzie wynosił 4 bajty. ' funkcja generateData (num) { var data = new Uint8Array (4); dla (var i = 0; i <4; i ++) { danych [j] = (Lb >> (i * 8)) & 0xff; } var kropelka = nowy blob ([dane] { typ: "Strumień aplikacji/oktetów" }); okno powrotu.URL.createObjectURL (blob); } var num = 1065489844; dokument.write ('download'); ' – Bechir

11

Teraz można użyć ArrayBuffer i DataView. Są natywne, więc wydajność będzie znacznie lepsza, jeśli będziesz musiał z niego korzystać bardzo często.

function toBytesInt32 (num) { 
    arr = new ArrayBuffer(4); // an Int32 takes 4 bytes 
    view = new DataView(arr); 
    view.setUint32(0, num, false); // byteOffset = 0; litteEndian = false 
    return arr; 
} 

równa

function toBytesInt32 (num) { 
    arr = new Uint8Array([ 
     (num & 0xff000000) >> 24, 
     (num & 0x00ff0000) >> 16, 
     (num & 0x0000ff00) >> 8, 
     (num & 0x000000ff) 
    ]); 
    return arr.buffer; 
} 

które używają javascript operatory bitowe, aby to osiągnąć.

+0

To jest naprawdę całkiem interesujące zobaczyć, dlaczego '(uint8) (num i 0xFF000000) >> 24' działa na przykład dla 'num = 0xF0000000': Operator >> konwertuje swoje operandy na 32-bitowe komplementy, więc' 0xF0000000' przepełnia się do '-0x0FFFFFFF', który jest przesunięty do' -0x0F'. Uint8Array następnie konwertuje swoje wartości na niepodpisane 8-bitowe liczby całkowite, biorąc '-0x0F' modulo' 0xFF' (ten modulo tutaj NIE jest operatorem '%', ale zawsze zwraca pozytywne wyniki zgodnie ze specyfikacjami JS). Rezultatem tego jest w końcu '0xF0', zgodnie z oczekiwaniami. Byłoby miłe pytanie wywiadu;) –

1

Odpowiedź SEIAROTg nie wyświetla ciągu. Mam przetestowane testy zarówno z liczbami dodatnimi, jak i ujemnymi, a ten kod da ci 4-bajtowe wyjście łańcuchowe reprezentujące liczbę w dużym formacie endien (komplement 2: 0xFFFFFFFF = -1).

var toBytesInt32=function(num) { 
    var ascii=''; 
    for (let i=3;i>=0;i--) { 
     ascii+=String.fromCharCode((num>>(8*i))&255); 
    } 
    return ascii; 
}; 

nawiasem mówiąc, jeśli chcesz iść na odwrót można użyć

var fromBytesInt32=function(numString) { 
    var result=0; 
    for (let i=3;i>=0;i--) { 
     result+=numString.charCodeAt(3-i)<<(8*i); 
    } 
    return result; 
}; 

przekonwertować ciąg 4 bajtów do liczby całkowitej

+0

To ograniczenie javascript. JavaScript uważa dowolny 32-bitowy numer z pierwszą cyfrą jako 1 liczbą ujemną. –

+0

Zrobiłem błędne założenie dotyczące Twojego kodu. Twoja odpowiedź działa poprawnie dla argumentów * negatywnych i pozytywnych *, o ile są one w zakresie (* podpisane *) 32-bitowe liczby całkowite. Usuwam moje komentarze, przepraszam za zamieszanie –

Powiązane problemy