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 }