package fds import ( "fmt" ) type FdsDate struct { Year int Month int Day int } func NewFdsDate(raw []byte) (*FdsDate, error) { if len(raw) != 3 { return nil, fmt.Errorf("Must be three bytes") } if raw[1] == 0x00 || raw[1] > 0x12 || (raw[1] > 0x09 && raw[1] < 0x10) { return nil, fmt.Errorf("Invalid month: %02X", raw[1]) } if raw[2] == 0x00 || raw[2] > 0x31 || (raw[2] > 0x09 && raw[2] < 0x10) || (raw[2] > 0x19 && raw[2] < 0x20) || (raw[2] > 0x29 && raw[2] < 0x30) { return nil, fmt.Errorf("Invalid day: %02X", raw[1]) } return &FdsDate{ Year: bcdToDec(raw[0]), Month: bcdToDec(raw[1]), Day: bcdToDec(raw[2]), }, nil } func bcdToDec(val byte) int { v := int(val) return (v>>4)*10 + (v&0x0F) } func (date *FdsDate) String() string { return fmt.Sprintf("Years: %04d/%04d/%04d Month: %d Day: %d", date.Year+1926, date.Year+1989, date.Year+1900, date.Month, date.Day, ) } //func (date *FdsDate) Raw() []byte { //}