You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
1.8 KiB
78 lines
1.8 KiB
package tools |
|
|
|
import ( |
|
"fmt" |
|
"os" |
|
"path/filepath" |
|
) |
|
|
|
//LittleEndian |
|
func getUint16(b []byte, offset int) uint16 { |
|
_ = b[offset+1] // early bounds check |
|
return uint16(b[offset+0]) | |
|
uint16(b[offset+1])<<8 |
|
} |
|
|
|
//LittleEndian |
|
func getUint32(b []byte, offset int) uint32 { |
|
_ = b[offset+3] // early bounds check |
|
return uint32(b[offset+0]) | |
|
uint32(b[offset+1])<<8 | |
|
uint32(b[offset+2])<<16 | |
|
uint32(b[offset+3])<<24 |
|
} |
|
|
|
//LittleEndian |
|
func getUint64(b []byte, offset int) uint64 { |
|
_ = b[offset+7] // bounds check hint to compiler; see golang.org/issue/14808 |
|
return uint64(b[offset+0]) | |
|
uint64(b[offset+1])<<8 | |
|
uint64(b[offset+2])<<16 | |
|
uint64(b[offset+3])<<24 | |
|
uint64(b[offset+4])<<32 | |
|
uint64(b[offset+5])<<40 | |
|
uint64(b[offset+6])<<48 | |
|
uint64(b[offset+7])<<56 |
|
} |
|
|
|
//LittleEndian |
|
func putUint64(v uint64, b []byte, offset int) { |
|
_ = b[offset+7] // early bounds check to guarantee safety of writes below |
|
b[offset+0] = byte(v) |
|
b[offset+1] = byte(v >> 8) |
|
b[offset+2] = byte(v >> 16) |
|
b[offset+3] = byte(v >> 24) |
|
b[offset+4] = byte(v >> 32) |
|
b[offset+5] = byte(v >> 40) |
|
b[offset+6] = byte(v >> 48) |
|
b[offset+7] = byte(v >> 56) |
|
} |
|
|
|
//LittleEndian |
|
func putUint32(v uint32, b []byte, offset int) { |
|
_ = b[offset+3] |
|
b[offset+0] = byte(v) |
|
b[offset+1] = byte(v >> 8) |
|
b[offset+2] = byte(v >> 16) |
|
b[offset+3] = byte(v >> 24) |
|
} |
|
|
|
func copyBytes(src []byte, srcStart int, dst []byte, dstStart int, count int) (int, error) { |
|
if len(src) < srcStart+count || len(dst) < dstStart+count { |
|
return -1, fmt.Errorf("Array index out of bounds") |
|
} |
|
for i := 0; i < count; i++ { |
|
dst[dstStart+i] = src[srcStart+i] |
|
} |
|
return count, nil |
|
} |
|
|
|
func fileNameAndExt(path string) (string, string) { |
|
name := filepath.Base(path) |
|
for i := len(name) - 1; i >= 0 && !os.IsPathSeparator(name[i]); i-- { |
|
if name[i] == '.' { |
|
return name[:i], name[i:] |
|
} |
|
} |
|
return name, "" |
|
}
|
|
|