2017-06-20 08:37:40 -07:00
|
|
|
package units
|
|
|
|
|
|
|
|
// Base2Bytes is the old non-SI power-of-2 byte scale (1024 bytes in a kilobyte,
|
|
|
|
// etc.).
|
|
|
|
type Base2Bytes int64
|
|
|
|
|
|
|
|
// Base-2 byte units.
|
|
|
|
const (
|
|
|
|
Kibibyte Base2Bytes = 1024
|
|
|
|
KiB = Kibibyte
|
|
|
|
Mebibyte = Kibibyte * 1024
|
|
|
|
MiB = Mebibyte
|
|
|
|
Gibibyte = Mebibyte * 1024
|
|
|
|
GiB = Gibibyte
|
|
|
|
Tebibyte = Gibibyte * 1024
|
|
|
|
TiB = Tebibyte
|
|
|
|
Pebibyte = Tebibyte * 1024
|
|
|
|
PiB = Pebibyte
|
|
|
|
Exbibyte = Pebibyte * 1024
|
|
|
|
EiB = Exbibyte
|
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
bytesUnitMap = MakeUnitMap("iB", "B", 1024)
|
|
|
|
oldBytesUnitMap = MakeUnitMap("B", "B", 1024)
|
|
|
|
)
|
|
|
|
|
|
|
|
// ParseBase2Bytes supports both iB and B in base-2 multipliers. That is, KB
|
|
|
|
// and KiB are both 1024.
|
2020-02-17 13:13:33 -08:00
|
|
|
// However "kB", which is the correct SI spelling of 1000 Bytes, is rejected.
|
2017-06-20 08:37:40 -07:00
|
|
|
func ParseBase2Bytes(s string) (Base2Bytes, error) {
|
|
|
|
n, err := ParseUnit(s, bytesUnitMap)
|
|
|
|
if err != nil {
|
|
|
|
n, err = ParseUnit(s, oldBytesUnitMap)
|
|
|
|
}
|
|
|
|
return Base2Bytes(n), err
|
|
|
|
}
|
|
|
|
|
|
|
|
func (b Base2Bytes) String() string {
|
|
|
|
return ToString(int64(b), 1024, "iB", "B")
|
|
|
|
}
|
|
|
|
|
|
|
|
var (
|
|
|
|
metricBytesUnitMap = MakeUnitMap("B", "B", 1000)
|
|
|
|
)
|
|
|
|
|
|
|
|
// MetricBytes are SI byte units (1000 bytes in a kilobyte).
|
|
|
|
type MetricBytes SI
|
|
|
|
|
|
|
|
// SI base-10 byte units.
|
|
|
|
const (
|
|
|
|
Kilobyte MetricBytes = 1000
|
|
|
|
KB = Kilobyte
|
|
|
|
Megabyte = Kilobyte * 1000
|
|
|
|
MB = Megabyte
|
|
|
|
Gigabyte = Megabyte * 1000
|
|
|
|
GB = Gigabyte
|
|
|
|
Terabyte = Gigabyte * 1000
|
|
|
|
TB = Terabyte
|
|
|
|
Petabyte = Terabyte * 1000
|
|
|
|
PB = Petabyte
|
|
|
|
Exabyte = Petabyte * 1000
|
|
|
|
EB = Exabyte
|
|
|
|
)
|
|
|
|
|
|
|
|
// ParseMetricBytes parses base-10 metric byte units. That is, KB is 1000 bytes.
|
|
|
|
func ParseMetricBytes(s string) (MetricBytes, error) {
|
|
|
|
n, err := ParseUnit(s, metricBytesUnitMap)
|
|
|
|
return MetricBytes(n), err
|
|
|
|
}
|
|
|
|
|
2020-02-17 13:13:33 -08:00
|
|
|
// TODO: represents 1000B as uppercase "KB", while SI standard requires "kB".
|
2017-06-20 08:37:40 -07:00
|
|
|
func (m MetricBytes) String() string {
|
|
|
|
return ToString(int64(m), 1000, "B", "B")
|
|
|
|
}
|
|
|
|
|
|
|
|
// ParseStrictBytes supports both iB and B suffixes for base 2 and metric,
|
2020-02-17 13:13:33 -08:00
|
|
|
// respectively. That is, KiB represents 1024 and kB, KB represent 1000.
|
2017-06-20 08:37:40 -07:00
|
|
|
func ParseStrictBytes(s string) (int64, error) {
|
|
|
|
n, err := ParseUnit(s, bytesUnitMap)
|
|
|
|
if err != nil {
|
|
|
|
n, err = ParseUnit(s, metricBytesUnitMap)
|
|
|
|
}
|
|
|
|
return int64(n), err
|
|
|
|
}
|