[英]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.