62 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package main
 | |
| 
 | |
| import (
 | |
| "encoding/binary"
 | |
| "io"
 | |
| "fmt"
 | |
| )
 | |
| 
 | |
| var BE = binary.BigEndian
 | |
| 
 | |
| func readU8(r io.Reader) (uint8, error) {
 | |
| 	var result uint8
 | |
| 	err := binary.Read(r, BE, &result);
 | |
| 	return result, err
 | |
| }
 | |
| 
 | |
| func readU16(r io.Reader) (uint16, error) {
 | |
| 	var result uint16
 | |
| 	err := binary.Read(r, BE, &result);
 | |
| 	return result, err
 | |
| }
 | |
| func readU32(r io.Reader) (uint32, error) {
 | |
| 	var result uint32
 | |
| 	err := binary.Read(r, BE, &result);
 | |
| 	return result, err
 | |
| }
 | |
| func readString(r io.Reader) (string, error) {
 | |
| 	l, err := readU8(r)
 | |
| 	if err == nil && l == 0 {
 | |
| 		err = fmt.Errorf("invalid string length 0")
 | |
| 	}
 | |
| 	if err != nil { return "", err}
 | |
| 	buf := make([]byte, l)
 | |
| 	_, err = io.ReadFull(r, buf)
 | |
| 	return string(buf), err
 | |
| }
 | |
| 
 | |
| func readLString(r io.Reader) (string, error) {
 | |
| 	l, err := readU32(r)
 | |
| 	if err == nil && l == 0 {
 | |
| 		err = fmt.Errorf("invalid string length 0")
 | |
| 	}
 | |
| 	if err != nil { return "", err}
 | |
| 	buf := make([]byte, l)
 | |
| 	_, err = io.ReadFull(r, buf)
 | |
| 	return string(buf), err
 | |
| }
 | |
| 
 | |
| func writeLString(w io.Writer, s string) error {
 | |
|   writeU32(w,uint32(len(s)))
 | |
|   _, err := w.Write([]byte(s))
 | |
|   return err
 | |
| }
 | |
| 
 | |
| func writeU8(w io.Writer, i uint8) error {
 | |
|   return binary.Write(w, BE, i);
 | |
| }
 | |
| 
 | |
| func writeU32(w io.Writer, i uint32) error {
 | |
|   return binary.Write(w, BE, i);
 | |
| }
 | 
