public static PrimitiveValue getVal(
      final DirectBuffer buffer, final PrimitiveType type, final int length) {
    if (length == 0) {
      return null;
    }

    switch (type) {
      case CHAR:
        if (length == 1) {
          return new PrimitiveValue(CodecUtil.charGet(buffer, 0), 1);
        } else {
          final byte[] array = new byte[length];
          CodecUtil.charsGet(buffer, 0, array, 0, array.length);
          return new PrimitiveValue(array, "UTF-8", array.length);
        }

      case INT8:
        return new PrimitiveValue(CodecUtil.int8Get(buffer, 0), 1);

      case INT16:
        return new PrimitiveValue(CodecUtil.int16Get(buffer, 0, ByteOrder.LITTLE_ENDIAN), 2);

      case INT32:
        return new PrimitiveValue(CodecUtil.int32Get(buffer, 0, ByteOrder.LITTLE_ENDIAN), 4);

      case INT64:
        return new PrimitiveValue(CodecUtil.int64Get(buffer, 0, ByteOrder.LITTLE_ENDIAN), 8);

      case UINT8:
        return new PrimitiveValue(CodecUtil.uint8Get(buffer, 0), 1);

      case UINT16:
        return new PrimitiveValue(CodecUtil.uint16Get(buffer, 0, ByteOrder.LITTLE_ENDIAN), 2);

      case UINT32:
        return new PrimitiveValue(CodecUtil.uint32Get(buffer, 0, ByteOrder.LITTLE_ENDIAN), 4);

      case UINT64:
        return new PrimitiveValue(CodecUtil.uint64Get(buffer, 0, ByteOrder.LITTLE_ENDIAN), 8);

      case FLOAT:
        return new PrimitiveValue(CodecUtil.floatGet(buffer, 0, ByteOrder.LITTLE_ENDIAN), 4);

      case DOUBLE:
        return new PrimitiveValue(CodecUtil.doubleGet(buffer, 0, ByteOrder.LITTLE_ENDIAN), 8);

      default:
        return null;
    }
  }