将Gbs / Mbs转换为字节

时间:2010-03-02 14:26:12

标签: php

我有一个像这样的开关盒

switch($filesize_in_bytes){
    case "10Mb <= $filesize_in_bytes <= 100Mb":
        //do some stuff and break;

    case "1Gb <= $filesize_in_bytes <= 10Gb":
        //do some stuff and break;
}

正如您所看到的,$filesize_in_bytes以字节为单位,现在如何将这些值与Mbs和Gbs转换为字节?案例10Mb, 100Mb, 1Gb and so on我不能将它们直接硬编码为字节,并且值也因用户状态而不同。

案例来自数据库:

$rule1[0] = '10Mb';
$rule1[1] = '100Mb';

$rule2[0] = '1Gb';
$rule2[1] = '10Gb';

2 个答案:

答案 0 :(得分:1)

首先,我不太喜欢这个数据库设计。为了不通过将限制实际存储为整数来浪费字节级精度上的空间(对于诸如100Gb之类的东西需要完整的BIGINT),您可能希望改为执行limit_amount INT UNSIGNED之类的操作。 limit_unit ENUM('b','kb','Mb','Gb')。然后从数据库中提取时,您只需进行简单的数学运算即可得到字节值:

$limit_amount = 10; // pull from
$limit_unit = 'Mb'; // database
$units = array('b' => 1, 'kb' => 125, 'Mb' => 125000, 'Gb' => 125000000);
$limit_in_bytes = $limit_amount * $units[$limit_unit];

(请注意,此系统的单元使用kbMb,它们与kBMB不同,是更常见的单位。如果您想要后者,做出正确的转换!)

这比以字符串形式存储更具数据效率,确保用户在输入字符串时不会放入像“5lolCats”这样的无意义单位,并且可以轻松地将数据拉回字节。

...或者您可以使用BIGINT。我不介意,所以只要你不将整数值存储为字符串。

Tahdah。你已经从数据库中提取了数量而不是字符串,现在你可以进行直接的整数比较,而不需要魔术字符串比较怪异。

答案 1 :(得分:0)

查看以下PHP脚本,该脚本提供了完成此操作的功能:

http://aidanlister.com/2004/04/human-readable-file-sizes/