docs: public static String bytesToString(byte[] bytes, boolean noCase) {
          char[] digits = noCase ? DIGITS_NOCASE : DIGITS;
          int digitsLength = digits.length;
  
          if (ArrayUtils.isEmpty(bytes)) {
              return String.valueOf(digits[0]);
          }
  
          StringBuilder strValue = new StringBuilder();
          int value = 0;
          int limit = Integer.MAX_VALUE >>> 8;
          int i = 0;
  
          do {
              while (i < bytes.length && value < limit) {
                  value = (value << 8) + (0xFF & bytes[i++]);
              }
  
              while (value >= digitsLength) {
                  strValue.append(digits[value % digitsLength]);
                  value = value / digitsLength;
              }
          } while (i < bytes.length);
  
          if (value != 0 || strValue.length() == 0) {
              strValue.append(digits[value]);
          }
  
          return strValue.toString();
      }