簡體   English   中英

誰能給我解釋一下這個 function,我無法理解

[英]Could anyone please explain me this function, I am not able to understand this

   unsigned long fileSize = file.size();
   byte buf[4];
   buf[0] = (byte) fileSize & 0xFF;
   buf[1] = (byte) (fileSize >> 8) & 0xFF;
   buf[2] = (byte) (fileSize >> 16) & 0xFF;
   buf[3] = (byte) (fileSize >> 24) & 0xFF;  
   

任何人都可以向我解釋這個代碼。假設一個文件的大小是你選擇的

該代碼采用文件大小的低 4 字節( unsigned long可能是 4 或 8 字節,具體取決於平台/編譯器),並以小端字節順序將這 4 個單獨的字節存儲到buf數組中。

它獲取fileSize的最低 8 位並將它們存儲到buf[0]中,然后獲取次低的 8 位並將它們存儲到buf[1]中,對於buf[2]buf[3]依此類推。

假設您想將十進制數 8375 拆分為數字。 你可以這樣做:

unsigned     value = 8375;
unsigned     digit_0 =  value         % 10;  // Gives 5
unsigned     digit_1 = (value /   10) % 10;  // Gives 7
unsigned     digit_2 = (value /  100) % 10;  // Gives 3
unsigned     digit_3 = (value / 1000) % 10;  // Gives 8

那么,您發布的代碼就是這樣做的。 只有它將數字分成八位字節即成對的十六進制數字。 即每個八位位組都可以取 [0..255] 范圍內的值。

發布的代碼使用按位運算: (a >> 8)實際上是(a / 256)(a & 0xFF)(a % 256)

該程序將 unsigned long integer 的四個字節存儲到另一個字節數組中。 語句buf[0] = (byte) fileSize & 0xFF; 執行位掩碼,因此從無符號長數中提取最后 8 位。 為了進一步提取 8 位,我們將數字右移 8 位,然后再次執行位屏蔽等。

這只是找到 4 字節 integer 的 4 個字節。它以十六進制表示,就像您從 2020 年開始查找 [2,0,2,0] 一樣。

它的實現方式是移動位並使用 AND 和全 1 的掩碼。

在小端系統上,它與:

memcpy(buf, &fileSize, 4);

要么

union 
{
   unsigned long filesize;
   unsigned char buff[4];
}x = {.filesize = file.size());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM