code: func (d *dataEncoder) classifyDataModes() {
  	var start int
  	mode := dataModeNone
  
  	for i, v := range d.data {
  		newMode := dataModeNone
  		switch {
  		case v >= 0x30 && v <= 0x39:
  			newMode = dataModeNumeric
  		case v == 0x20 || v == 0x24 || v == 0x25 || v == 0x2a || v == 0x2b || v ==
  			0x2d || v == 0x2e || v == 0x2f || v == 0x3a || (v >= 0x41 && v <= 0x5a):
  			newMode = dataModeAlphanumeric
  		default:
  			newMode = dataModeByte
  		}
  
  		if newMode != mode {
  			if i > 0 {
  				d.actual = append(d.actual, segment{dataMode: mode, data: d.data[start:i]})
  
  				start = i
  			}
  
  			mode = newMode
  		}
  	}
  
  	d.actual = append(d.actual, segment{dataMode: mode, data: d.data[start:len(d.data)]})
  }
docs: // classifyDataModes classifies the raw data into unoptimised segments.
  // e.g. "123ZZ#!#!" =>
  // [numeric, 3, "123"] [alphanumeric, 2, "ZZ"] [byte, 4, "#!#!"].