binary.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package udf
  2. import (
  3. "encoding/binary"
  4. "time"
  5. "golang.org/x/text/encoding/charmap"
  6. "golang.org/x/text/encoding/unicode"
  7. "golang.org/x/text/transform"
  8. )
  9. func r_u8(b []byte) uint8 {
  10. return b[0]
  11. }
  12. func r_i8(b []byte) int8 {
  13. return int8(r_u8(b))
  14. }
  15. var rl_u64 = binary.LittleEndian.Uint64
  16. func rl_u48(b []byte) uint64 {
  17. var buf [8]byte
  18. copy(buf[:], b[:6])
  19. return rl_u64(buf[:])
  20. }
  21. var rl_u32 = binary.LittleEndian.Uint32
  22. var rl_u16 = binary.LittleEndian.Uint16
  23. func rl_i64(b []byte) int64 {
  24. return int64(rl_u64(b))
  25. }
  26. func rl_i32(b []byte) int32 {
  27. return int32(rl_u32(b))
  28. }
  29. func rl_i16(b []byte) int16 {
  30. return int16(rl_u16(b))
  31. }
  32. var rb_u64 = binary.BigEndian.Uint64
  33. var rb_u32 = binary.BigEndian.Uint32
  34. var rb_u16 = binary.BigEndian.Uint16
  35. func rb_u8(b []byte) uint8 {
  36. return b[0]
  37. }
  38. func rb_i64(b []byte) int64 {
  39. return int64(rb_u64(b))
  40. }
  41. func rb_i32(b []byte) int32 {
  42. return int32(rb_u32(b))
  43. }
  44. func rb_i16(b []byte) int16 {
  45. return int16(rb_u16(b))
  46. }
  47. func r_dstring(b []byte, fieldlen int) string {
  48. if fieldlen == 0 {
  49. return ""
  50. }
  51. return string(b[:b[fieldlen-1]])
  52. }
  53. func r_dcharacters(b []byte) string {
  54. if len(b) == 0 {
  55. return ""
  56. }
  57. switch b[0] {
  58. case 8:
  59. s, _, err := transform.Bytes(charmap.Windows1252.NewDecoder(), b[1:])
  60. if err != nil {
  61. panic(err)
  62. }
  63. return string(s)
  64. case 16:
  65. s, _, err := transform.Bytes(unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM).NewDecoder(), b[1:])
  66. if err != nil {
  67. panic(err)
  68. }
  69. return string(s)
  70. default:
  71. return ""
  72. }
  73. }
  74. func r_timestamp(b []byte) time.Time {
  75. var t time.Time
  76. t = t.AddDate(int(rl_u16(b[2:])), int(b[4]), int(b[5]))
  77. t.Add(time.Duration(b[6])*time.Hour +
  78. time.Duration(b[7])*time.Minute +
  79. time.Duration(b[8])*time.Second)
  80. return t
  81. }