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