bufr/src/main/java/ucar/nc2/iosp/bufr/DataDescriptorTreeConstructor.java
private List<DataDescriptor> decode(List<Short> keyDesc, BufrTableLookup lookup) {
    if (keyDesc == null) return null;

    List<DataDescriptor> keys = new ArrayList<DataDescriptor>();
    for (short id : keyDesc) {
      DataDescriptor dd = new DataDescriptor(id, lookup);
      keys.add( dd);
      if (dd.f == 3) {
        TableD.Descriptor tdd = lookup.getDescriptorTableD(dd.fxy);
        if (tdd == null || tdd.getSequence() == null) {
          dd.bad = true;
        } else {
          dd.name = tdd.getName();
          dd.subKeys = decode(tdd.getSequence(), lookup);
        }
      }
    }
    return keys;
  }
private List<DataDescriptor> decode(List<Short> keyDesc, BufrTableLookup lookup) {
    if (keyDesc == null) return null;

    List<DataDescriptor> keys = new ArrayList<DataDescriptor>();
    for (short id : keyDesc) {
      DataDescriptor dd = new DataDescriptor(id, lookup);
      keys.add( dd);
      if (dd.f == 3) {
        TableD.Descriptor tdd = lookup.getDescriptorTableD(dd.fxy);
        if (tdd == null || tdd.getSequence() == null) {
          dd.bad = true;
        } else {
          dd.name = tdd.getName();
          dd.subKeys = decode(tdd.getSequence(), lookup);
        }
      }
    }
    return keys;
  }
convert ids to DataDescriptors, expand table D