0 前言
当我们想显示以太网数据量大小时,往往有个头疼的单位需要处理,单位取小了不一目了然,单位取大了精度太低。本例设计一个函数,将根据以太网数据量大小自动生成单位可变的字符串(KB、MB、GB、TB、PB),解决这一痛点。
1 以太网数据量大小字符串生成方法(可变单位)
1.1 相关宏定义
#define KB (u64)1024
#define MB (u64)(1024 * KB)
#define GB (u64)(1024 * MB)
#define TB (u64)(1024 * GB)
#define PB (u64)(1024 * TB)
#define EB (u64)(1024 * PB)
既然是可变单位,我们就得先定义KB、MB、GB、TB、PB、EB对应的Byte大小。
1.2 获取数据量大小对应字符串函数设计
/**
* @brief 获取数据量大小对应的字符串
*
* @param totalByte 总数据量(单位:Byte)
* @param dataSizeStr 数据量字符串指针(容量≥10Byte)
*/
void get_data_size_str(u64 totalByte, char *dataSizeStr)
{
double dataSize;
if (totalByte < KB)
{
dataSize = totalByte;
sprintf(dataSizeStr, "%0.2lfB", dataSize);
}
else if (totalByte < MB)
{
dataSize = totalByte / (double)KB;
sprintf(dataSizeStr, "%0.2lfKB", dataSize);
}
else if (totalByte < GB)
{
dataSize = totalByte / (double)MB;
sprintf(dataSizeStr, "%0.2lfMB", dataSize);
}
else if (totalByte < TB)
{
dataSize = totalByte / (double)GB;
sprintf(dataSizeStr, "%0.2lfGB", dataSize);
}
else if (totalByte < PB)
{
dataSize = totalByte / (double)TB;
sprintf(dataSizeStr, "%0.2lfTB", dataSize);
}
else if (totalByte < EB)
{
dataSize = totalByte / (double)PB;
sprintf(dataSizeStr, "%0.2lfPB", dataSize);
}
}
这里将传入的totalByte划分为几个范围,对应单位如下:
0-1KB:单位B
1KB-1MB:单位KB
1MB-1GB:单位MB
1GB-1TB:单位GB
1TB-1PB:单位TB
1PB-1EB:单位PB
可以看到由于每个单位之间倍数关系是1024,我们就可以将每次传入的totalByte在对应单位下求得的数据量的整数部分控制在1.00-1023.99之间,我们就可以一目了然看出以太网数据量大小。
2 测试
2.1 测试函数设计
int main(void)
{
int i;
u64 dataSizeUnit[5] = {KB, MB, GB, TB, PB};
char dataSizeStr[16];
for (i = 0; i < 5; i++)
{
get_data_size_str(dataSizeUnit[i], dataSizeStr);
printf("Data : %s\r\n", dataSizeStr);
}
return 0;
}
我们的测试函数设计非常简单,就是传入KB、MB、GB、TB、PB,查看生成的数据量大小字符串是否正确。预期打印的结果分别是1.00KB、1.00MB、1.00GB、1.00TB、1.00PB。
2.2 测试结果
可以看到数据结果和我们预期的一致。