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 测试结果
可以看到数据结果和我们预期的一致。