// Copyright 2015 Tony Bai. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // See the License for the specific language governing permissions and // limitations under the License. package cmpputils import ( "bytes" "errors" "fmt" "io/ioutil" "strings" "unicode/utf8" "unsafe" "golang.org/x/text/encoding/simplifiedchinese" "golang.org/x/text/encoding/unicode" "golang.org/x/text/transform" ) var ErrInvalidUtf8Rune = errors.New("Not Invalid Utf8 runes") func IsBigEndian() bool { var i uint16 = 0x1234 var p *[2]byte = (*[2]byte)(unsafe.Pointer(&i)) if (*p)[0] == 0x12 { return true } return false } // TimeStamp2Str converts a timestamp(MMDDHHMMSS) int to a string(10 bytes). func TimeStamp2Str(t uint32) string { return fmt.Sprintf("%010d", t) } func Utf8ToUcs2(in string) (string, error) { if !utf8.ValidString(in) { return "", ErrInvalidUtf8Rune } r := bytes.NewReader([]byte(in)) t := transform.NewReader(r, unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM).NewEncoder()) //UTF-16 bigendian, no-bom out, err := ioutil.ReadAll(t) if err != nil { return "", err } return string(out), nil } func Ucs2ToUtf8(in string) (string, error) { r := bytes.NewReader([]byte(in)) t := transform.NewReader(r, unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM).NewDecoder()) //UTF-16 bigendian, no-bom out, err := ioutil.ReadAll(t) if err != nil { return "", err } return string(out), nil } func Utf8ToGB18030(in string) (string, error) { if !utf8.ValidString(in) { return "", ErrInvalidUtf8Rune } r := bytes.NewReader([]byte(in)) t := transform.NewReader(r, simplifiedchinese.GB18030.NewEncoder()) out, err := ioutil.ReadAll(t) if err != nil { return "", err } return string(out), nil } func GB18030ToUtf8(in string) (string, error) { r := bytes.NewReader([]byte(in)) t := transform.NewReader(r, simplifiedchinese.GB18030.NewDecoder()) out, err := ioutil.ReadAll(t) if err != nil { return "", err } return string(out), nil } func OctetString(s string, fixedLength int) string { length := len(s) if length == fixedLength { return s } if length > fixedLength { return s[length-fixedLength:] } return strings.Join([]string{s, string(make([]byte, fixedLength-length))}, "") }