github.com/astrogo/fitsio@v0.3.0/binary.go (about)

     1  // Copyright 2017 The astrogo Authors.  All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package fitsio
     6  
     7  import (
     8  	"encoding/binary"
     9  	"io"
    10  	"math"
    11  )
    12  
    13  type rbuf struct {
    14  	p []byte // buffer of data to read from
    15  	c int    // current position in buffer of data
    16  }
    17  
    18  func newReader(data []byte) *rbuf {
    19  	return &rbuf{p: data, c: 0}
    20  }
    21  
    22  func (r *rbuf) Read(p []byte) (int, error) {
    23  	if r.c >= len(r.p) {
    24  		return 0, io.EOF
    25  	}
    26  	n := copy(p, r.p[r.c:])
    27  	r.c += n
    28  	return n, nil
    29  }
    30  
    31  func (r *rbuf) readByte(v *byte) {
    32  	*v = r.p[r.c]
    33  	r.c++
    34  }
    35  
    36  func (r *rbuf) readBool(v *bool) {
    37  	b := r.p[r.c]
    38  	r.c++
    39  	if b == 0 {
    40  		*v = false
    41  	} else {
    42  		*v = true
    43  	}
    44  }
    45  
    46  func (r *rbuf) readI8(v *int8) {
    47  	*v = int8(r.p[r.c])
    48  	r.c++
    49  }
    50  
    51  func (r *rbuf) readI16(v *int16) {
    52  	beg := r.c
    53  	r.c += 2
    54  	*v = int16(binary.BigEndian.Uint16(r.p[beg:r.c]))
    55  }
    56  
    57  func (r *rbuf) readI32(v *int32) {
    58  	beg := r.c
    59  	r.c += 4
    60  	*v = int32(binary.BigEndian.Uint32(r.p[beg:r.c]))
    61  }
    62  
    63  func (r *rbuf) readI64(v *int64) {
    64  	beg := r.c
    65  	r.c += 8
    66  	*v = int64(binary.BigEndian.Uint64(r.p[beg:r.c]))
    67  }
    68  
    69  func (r *rbuf) readInt(v *int) {
    70  	beg := r.c
    71  	r.c += 8
    72  	*v = int(int64(binary.BigEndian.Uint64(r.p[beg:r.c])))
    73  }
    74  
    75  func (r *rbuf) readU8(v *uint8) {
    76  	*v = r.p[r.c]
    77  	r.c++
    78  }
    79  
    80  func (r *rbuf) readU16(v *uint16) {
    81  	beg := r.c
    82  	r.c += 2
    83  	*v = binary.BigEndian.Uint16(r.p[beg:r.c])
    84  }
    85  
    86  func (r *rbuf) readU32(v *uint32) {
    87  	beg := r.c
    88  	r.c += 4
    89  	*v = binary.BigEndian.Uint32(r.p[beg:r.c])
    90  }
    91  
    92  func (r *rbuf) readU64(v *uint64) {
    93  	beg := r.c
    94  	r.c += 8
    95  	*v = binary.BigEndian.Uint64(r.p[beg:r.c])
    96  }
    97  
    98  func (r *rbuf) readUint(v *uint) {
    99  	beg := r.c
   100  	r.c += 8
   101  	*v = uint(binary.BigEndian.Uint64(r.p[beg:r.c]))
   102  }
   103  
   104  func (r *rbuf) readF32(v *float32) {
   105  	beg := r.c
   106  	r.c += 4
   107  	*v = math.Float32frombits(binary.BigEndian.Uint32(r.p[beg:r.c]))
   108  }
   109  
   110  func (r *rbuf) readF64(v *float64) {
   111  	beg := r.c
   112  	r.c += 8
   113  	*v = math.Float64frombits(binary.BigEndian.Uint64(r.p[beg:r.c]))
   114  }
   115  
   116  func (r *rbuf) readC64(v *complex64) {
   117  	beg := r.c
   118  	r.c += 4
   119  	vr := math.Float32frombits(binary.BigEndian.Uint32(r.p[beg:r.c]))
   120  
   121  	beg = r.c
   122  	r.c += 4
   123  	vi := math.Float32frombits(binary.BigEndian.Uint32(r.p[beg:r.c]))
   124  
   125  	*v = complex(vr, vi)
   126  }
   127  
   128  func (r *rbuf) readC128(v *complex128) {
   129  	beg := r.c
   130  	r.c += 8
   131  	vr := math.Float64frombits(binary.BigEndian.Uint64(r.p[beg:r.c]))
   132  
   133  	beg = r.c
   134  	r.c += 8
   135  	vi := math.Float64frombits(binary.BigEndian.Uint64(r.p[beg:r.c]))
   136  
   137  	*v = complex(vr, vi)
   138  }
   139  
   140  func (r *rbuf) readBools(vs []bool) {
   141  	for i := range vs {
   142  		r.readBool(&vs[i])
   143  	}
   144  }
   145  
   146  func (r *rbuf) readI8s(vs []int8) {
   147  	for i := range vs {
   148  		r.readI8(&vs[i])
   149  	}
   150  }
   151  
   152  func (r *rbuf) readI16s(vs []int16) {
   153  	for i := range vs {
   154  		r.readI16(&vs[i])
   155  	}
   156  }
   157  
   158  func (r *rbuf) readI32s(vs []int32) {
   159  	for i := range vs {
   160  		r.readI32(&vs[i])
   161  	}
   162  }
   163  
   164  func (r *rbuf) readI64s(vs []int64) {
   165  	for i := range vs {
   166  		r.readI64(&vs[i])
   167  	}
   168  }
   169  
   170  func (r *rbuf) readInts(vs []int) {
   171  	for i := range vs {
   172  		r.readInt(&vs[i])
   173  	}
   174  }
   175  
   176  func (r *rbuf) readU8s(vs []uint8) {
   177  	for i := range vs {
   178  		r.readU8(&vs[i])
   179  	}
   180  }
   181  
   182  func (r *rbuf) readU16s(vs []uint16) {
   183  	for i := range vs {
   184  		r.readU16(&vs[i])
   185  	}
   186  }
   187  
   188  func (r *rbuf) readU32s(vs []uint32) {
   189  	for i := range vs {
   190  		r.readU32(&vs[i])
   191  	}
   192  }
   193  
   194  func (r *rbuf) readU64s(vs []uint64) {
   195  	for i := range vs {
   196  		r.readU64(&vs[i])
   197  	}
   198  }
   199  
   200  func (r *rbuf) readUints(vs []uint) {
   201  	for i := range vs {
   202  		r.readUint(&vs[i])
   203  	}
   204  }
   205  
   206  func (r *rbuf) readF32s(vs []float32) {
   207  	for i := range vs {
   208  		r.readF32(&vs[i])
   209  	}
   210  }
   211  
   212  func (r *rbuf) readF64s(vs []float64) {
   213  	for i := range vs {
   214  		r.readF64(&vs[i])
   215  	}
   216  }
   217  
   218  func (r *rbuf) readC64s(vs []complex64) {
   219  	for i := range vs {
   220  		r.readC64(&vs[i])
   221  	}
   222  }
   223  
   224  func (r *rbuf) readC128s(vs []complex128) {
   225  	for i := range vs {
   226  		r.readC128(&vs[i])
   227  	}
   228  }
   229  
   230  type wbuf struct {
   231  	p []byte // buffer of data to write to
   232  	c int    // current position in buffer of data
   233  }
   234  
   235  func newWriter(data []byte) *wbuf {
   236  	return &wbuf{p: data, c: 0}
   237  }
   238  
   239  func (w *wbuf) Write(data []byte) (int, error) {
   240  	n := copy(w.p[w.c:], data)
   241  	if n < len(data) {
   242  		return n, io.ErrShortWrite
   243  	}
   244  	w.c += n
   245  	return n, nil
   246  }
   247  
   248  func (w *wbuf) bytes() []byte {
   249  	return w.p
   250  }
   251  
   252  func (w *wbuf) writeByte(v byte) {
   253  	w.p[w.c] = v
   254  	w.c++
   255  }
   256  
   257  func (w *wbuf) writeBool(v bool) {
   258  	var b byte
   259  	if v {
   260  		b = 1
   261  	}
   262  	w.p[w.c] = b
   263  	w.c++
   264  }
   265  
   266  func (w *wbuf) writeI8(v int8) {
   267  	w.p[w.c] = byte(v)
   268  	w.c++
   269  }
   270  
   271  func (w *wbuf) writeI16(v int16) {
   272  	beg := w.c
   273  	w.c += 2
   274  	binary.BigEndian.PutUint16(w.p[beg:w.c], uint16(v))
   275  }
   276  
   277  func (w *wbuf) writeI32(v int32) {
   278  	beg := w.c
   279  	w.c += 4
   280  	binary.BigEndian.PutUint32(w.p[beg:w.c], uint32(v))
   281  }
   282  
   283  func (w *wbuf) writeI64(v int64) {
   284  	beg := w.c
   285  	w.c += 8
   286  	binary.BigEndian.PutUint64(w.p[beg:w.c], uint64(v))
   287  }
   288  
   289  func (w *wbuf) writeInt(v int) {
   290  	beg := w.c
   291  	w.c += 8
   292  	binary.BigEndian.PutUint64(w.p[beg:w.c], uint64(v))
   293  }
   294  
   295  func (w *wbuf) writeU8(v uint8) {
   296  	w.p[w.c] = v
   297  	w.c++
   298  }
   299  
   300  func (w *wbuf) writeU16(v uint16) {
   301  	beg := w.c
   302  	w.c += 2
   303  	binary.BigEndian.PutUint16(w.p[beg:w.c], v)
   304  }
   305  
   306  func (w *wbuf) writeU32(v uint32) {
   307  	beg := w.c
   308  	w.c += 4
   309  	binary.BigEndian.PutUint32(w.p[beg:w.c], v)
   310  }
   311  
   312  func (w *wbuf) writeU64(v uint64) {
   313  	beg := w.c
   314  	w.c += 8
   315  	binary.BigEndian.PutUint64(w.p[beg:w.c], v)
   316  }
   317  
   318  func (w *wbuf) writeUint(v uint) {
   319  	beg := w.c
   320  	w.c += 8
   321  	binary.BigEndian.PutUint64(w.p[beg:w.c], uint64(v))
   322  }
   323  
   324  func (w *wbuf) writeF32(v float32) {
   325  	beg := w.c
   326  	w.c += 4
   327  	binary.BigEndian.PutUint32(w.p[beg:w.c], math.Float32bits(v))
   328  }
   329  
   330  func (w *wbuf) writeF64(v float64) {
   331  	beg := w.c
   332  	w.c += 8
   333  	binary.BigEndian.PutUint64(w.p[beg:w.c], math.Float64bits(v))
   334  }
   335  
   336  func (w *wbuf) writeC64(v complex64) {
   337  	beg := w.c
   338  	w.c += 4
   339  	binary.BigEndian.PutUint32(w.p[beg:w.c], math.Float32bits(real(v)))
   340  	beg = w.c
   341  	w.c += 4
   342  	binary.BigEndian.PutUint32(w.p[beg:w.c], math.Float32bits(imag(v)))
   343  }
   344  
   345  func (w *wbuf) writeC128(v complex128) {
   346  	beg := w.c
   347  	w.c += 8
   348  	binary.BigEndian.PutUint64(w.p[beg:w.c], math.Float64bits(real(v)))
   349  	beg = w.c
   350  	w.c += 8
   351  	binary.BigEndian.PutUint64(w.p[beg:w.c], math.Float64bits(imag(v)))
   352  }
   353  
   354  func (w *wbuf) writeBools(vs []bool) {
   355  	for _, v := range vs {
   356  		w.writeBool(v)
   357  	}
   358  }
   359  
   360  func (w *wbuf) writeI8s(vs []int8) {
   361  	for _, v := range vs {
   362  		w.writeI8(v)
   363  	}
   364  }
   365  
   366  func (w *wbuf) writeI16s(vs []int16) {
   367  	for _, v := range vs {
   368  		w.writeI16(v)
   369  	}
   370  }
   371  
   372  func (w *wbuf) writeI32s(vs []int32) {
   373  	for _, v := range vs {
   374  		w.writeI32(v)
   375  	}
   376  }
   377  
   378  func (w *wbuf) writeI64s(vs []int64) {
   379  	for _, v := range vs {
   380  		w.writeI64(v)
   381  	}
   382  }
   383  
   384  func (w *wbuf) writeU8s(vs []uint8) {
   385  	for _, v := range vs {
   386  		w.writeU8(v)
   387  	}
   388  }
   389  
   390  func (w *wbuf) writeU16s(vs []uint16) {
   391  	for _, v := range vs {
   392  		w.writeU16(v)
   393  	}
   394  }
   395  
   396  func (w *wbuf) writeU32s(vs []uint32) {
   397  	for _, v := range vs {
   398  		w.writeU32(v)
   399  	}
   400  }
   401  
   402  func (w *wbuf) writeU64s(vs []uint64) {
   403  	for _, v := range vs {
   404  		w.writeU64(v)
   405  	}
   406  }
   407  
   408  func (w *wbuf) writeF32s(vs []float32) {
   409  	for _, v := range vs {
   410  		w.writeF32(v)
   411  	}
   412  }
   413  
   414  func (w *wbuf) writeF64s(vs []float64) {
   415  	for _, v := range vs {
   416  		w.writeF64(v)
   417  	}
   418  }
   419  
   420  func (w *wbuf) writeC64s(vs []complex64) {
   421  	for _, v := range vs {
   422  		w.writeC64(v)
   423  	}
   424  }
   425  
   426  func (w *wbuf) writeC128s(vs []complex128) {
   427  	for _, v := range vs {
   428  		w.writeC128(v)
   429  	}
   430  }
   431  
   432  func (w *wbuf) writeUints(vs []uint) {
   433  	for _, v := range vs {
   434  		w.writeUint(v)
   435  	}
   436  }
   437  
   438  func (w *wbuf) writeInts(vs []int) {
   439  	for _, v := range vs {
   440  		w.writeInt(v)
   441  	}
   442  }