2011-11-18 23 views
8

我只是瞭解二進制和字節。我知道8位組成一個字節,而一個字節可以有256個可能性。我很困惑的是這樣的:究竟是一個字節,它與二進制文件有什麼關係?

byte[] b = new byte[] { 85, 85, 67, 75 }; 

什麼是85或上述任何數字與二進制。有一些東西沒有完全在我腦海中點擊。

+12

「毫無疑問,太簡單了。」 「沒有太簡單的問題」。 「沒有太簡單的問題」。它不工作。 –

+3

'85'與'binary'無關,因爲它是'decimal'。 '85 base 10' =='1010101 base 2'。這只是表示數字的一種方式 – Rob

+0

這不是代碼塊只是聲明一個字節數組,每個數字代表一個不同的字節? – Ari

回答

12

二進制是如何存儲在計算機內的東西。一目瞭然,無論是開還是關,真假,是否存在電流。 This Wikipedia article給它一個相當徹底的治療。

在您的示例中,像「85」這樣的表示是爲了方便讀者,爲了便於我們使用,字節爲格式爲。它可以格式化爲十六進制(基本16)爲「55」,八進制(基本8)爲「125」,二進制爲「1010101」,或者甚至「11」爲基本84,如果您如此傾向。所有的意思都是一樣的。

+5

對不起,與你相反,但零不是沒有電流,它只是一個不同的數量。並不是說OP可能在意這一點。 –

+1

@Chris:當然......高低邏輯狀態。我過分簡化了。 –

+1

+1這個問題只是維基百科(而不是MSDN)的尖叫 – sq33G

3

C#中的byte只是一個8位整數值。在上面的代碼中,你代表了一個數組中的4個數字 - 這與使用int的情況沒有什麼不同,只不過數字佔用了內存總空間的1/4。

它實際上與「二進制」無關 - 除了它是用於二進制數據的最常見表示。這是因爲大多數系統關於一個「字節」,這是一個8位數據塊。因此,如果您正在使用原始二進制信息進行操作,則字節是表示此數據的常用方式。

BitConverter類有從字節數組到其他類型和返回的例程。例如,它可以是價值或反其道而行之。請記住 - 所有存儲的數據都只是內存 - 您只是按特定順序保存一系列位(1和0),並且系統正在以特定方式解釋這些數據。

3

那些只是數字。它們與二進制本身無關。不過,如果你這樣選擇了,例如75 = 01001011就可以用二進制表示。

A byte這裏只是一個數據類型,它可以保存256個可能值中的一個。通常這被解釋爲0到255之間的數字或8個二進制數字(即8個ON/OFF值)。這些只是看待同一事物的兩種方式。

0

數組中的每個數字都小於256.它們被轉換爲二進制字節。這只是他們的十進制表示。

3

該語句聲明瞭一個字節數組,併爲其分配了4個元素 - 每個元素都是單個字節(理論上!)的大小。存儲在該陣列中的實際值 - 85,86,67,75 - 每個值都可以適合單個字節。在您的代碼示例中,這些值以十進制形式表示。一旦你的代碼轉換成可執行的形式,這些價值最終會通過您的計算機在他們的二進制表示看出,從寄存器不停地談論註冊,推,彈出,積累等

可以代表值源代碼中的其他基礎 - 例如十六進制或基數16,它比十進制更接近金屬,並相應地允許您的思維過程在人類表示和代碼實際說的之間輕鬆移動,因爲幾乎沒有實際的數學運算精神上在十六進制和二進制之間;另一個很好的例子是八進制。

或者你可以這樣想:代碼中的值使用與你所做的最相關的基礎。如果您將權限或顏色值(十六進制或八進制)如果您計算支票賬戶的利息,那麼顯而易見的選擇是十進制。

現在,對於您的特定代碼段 - 如果您正在處理單個字符或將原始數據寫入塊設備,則字節數組可能會很好 - 但是,隨着您與編譯器成爲一體,您的大腦可能最終會認爲十六進制更容易處理的表示。

+0

......我總是看到事情發生之前我想提到的其他事情之前,但我又失去了一點:擠壓存儲效率是另一個可能使用類型字節而不是int類型的原因。 – Christopher

+0

你是如何得到如此好的把握的?在線還是在學校? –

+1

當然不是學校 - 我靠近高中時遇到困難,不再去。不在線;書籍,實驗,磕磕碰碰,還有很多晚上只有我,我的編譯器,還有大量的滾燙的咖啡。 找到自己一個實用 - 並且緊迫! - 需要編程一些東西,任何東西。如果需求是絕對可怕的,並且截止日期是早上的第一件事情,那麼你可以很快得到很好的結果。 :) – Christopher

4

85只是一個數字的十進制(即「基數10」)positional notation。這意味着:

8 *^1 + 5 *^0

= 8×10 + 5 * 1

= 80 + 5

= 85

但是,您可以選擇任何基數來表示數字。我們人類有10個手指,這是在日常使用中「基礎10」系統的可能起源,但是無法在計算機的物理電路中表示10個不同的數字。該電路僅理解電子缺乏與電子的存在 - 即僅兩位數,因此二元系統。

所以,雖然你可以在你的程序的源代碼寫十進制85(保持它更自然的人類),它最終被計算機二進制1010101,相當於內表示...

1 *^6 + 0 *^5 + 1 *^4 + 0 *^3 + 1 *^2 + 0 *^1 + 1 *^0

= 1 * 64 + 0 * 32 + 1 * 16 + 0 * 8 + 1 * 4 + 0 * 2 + 1 * 1

= 64 + 16 + 4 + 1

= 85


BTW,十進制系統不「對齊」二進制 - 一個十進制數不能由二進制數字,圓十進制數不匹配以及圓形二進制數「整體」號表示。例如:

  • 10(十進制)= 1010(二進制)
  • 100(十進制)= 1100100(二進制)
  • 1000(十進制)= 1111101000(二進制)
  • 等...

有時,方便的是使用一個數字系統,它「對準」與二進制,如octal(一個八進制數字正是3二進制數)或hexadecimal(一個十六進制數是恰好4個二進制位)。

重要的一點是,所有這些系統最終都會在計算機中以二進制表示。

在一個側面說明:曾經是「sexa -decimal」「16進制」,但顯然侵犯了一些清教徒敏感性;)