123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- /*
- * Public Domain Software
- *
- * I (Matthias Ladkau) am the author of the source code in this file.
- * I have placed the source code in this file in the public domain.
- *
- * For further information see: http://creativecommons.org/publicdomain/zero/1.0/
- */
- /*
- Package bitutil contains common function for bit-level operations.
- Pack and Unpack functions are used to pack and unpack a list of non-zero numbers
- very efficiently.
- */
- package bitutil
- import (
- "bytes"
- "fmt"
- "math"
- )
- /*
- CompareByteArray compares the contents of two byte array slices. Returns true
- if both slices are equivalent in terms of size and content. The capacity may
- be different.
- */
- func CompareByteArray(arr1 []byte, arr2 []byte) bool {
- if len(arr1) != len(arr2) {
- return false
- }
- for i, v := range arr1 {
- if v != arr2[i] {
- return false
- }
- }
- return true
- }
- /*
- ByteSizeString takes a numeric byte size and returns it in human readable form.
- The useISU parameter determines which units to use. False uses the more common
- binary form. The units kibibyte, mebibyte, etc were established by the
- International Electrotechnical Commission (IEC) in 1998.
- useISU = True -> Decimal (as formally defined in the International System of Units)
- Bytes / Metric
- 1000^1 kB kilobyte
- 1000^2 MB megabyte
- 1000^3 GB gigabyte
- 1000^4 TB terabyte
- 1000^5 PB petabyte
- 1000^6 EB exabyte
- useISU = False -> Binary (as defined by the International Electrotechnical Commission)
- Bytes / Metric
- 1024^1 KiB kibibyte
- 1024^2 MiB mebibyte
- 1024^3 GiB gibibyte
- 1024^4 TiB tebibyte
- 1024^5 PiB pebibyte
- 1024^6 EiB exbibyte
- */
- func ByteSizeString(size int64, useISU bool) string {
- var byteSize, unit float64 = float64(size), 1024
- var pre string
- if useISU {
- unit = 1000
- }
- if byteSize < unit {
- return fmt.Sprintf("%d B", int(byteSize))
- }
- exp := math.Floor(math.Log(byteSize) / math.Log(unit))
- if useISU {
- pre = string("kMGTPE"[int(exp-1)])
- } else {
- pre = fmt.Sprintf("%vi", string("KMGTPE"[int(exp-1)]))
- }
- res := byteSize / math.Pow(unit, exp)
- return fmt.Sprintf("%.1f %sB", res, pre)
- }
- /*
- HexDump produces a more-or-less human readable hex dump from a given byte array
- slice.
- */
- func HexDump(data []byte) string {
- buf := new(bytes.Buffer)
- line := new(bytes.Buffer)
- buf.WriteString("====\n000000 ")
- for i, b := range data {
- if i != 0 && i%10 == 0 {
- buf.WriteString(fmt.Sprintf(" %s\n%06x ", line.String(), i))
- line = new(bytes.Buffer)
- }
- buf.WriteString(fmt.Sprintf("%02X ", b))
- line.WriteString(fmt.Sprintf("%c", b))
- }
- rest := len(data) % 10
- if rest != 0 {
- for i := rest; i < 10; i++ {
- buf.WriteString(" ")
- }
- }
- buf.WriteString(fmt.Sprintf(" %s\n====\n", line.String()))
- return buf.String()
- }
|