How to convert Hex to decimal value in Java - java

I currently have an application where I receive 2 values e.g. 0e 15 through bluetooth.
I now want to display these in decimal values.
The code is as follows:
private static final char[] DIGITS_LOWER = {'0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
private static final char[] DIGITS_UPPER = {'0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
public static String formatHexString(byte[] data) {
return formatHexString(data, false);
}
public static String formatHexString(byte[] data, boolean addSpace) {
if (data == null || data.length < 1)
return null;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < data.length; i++) {
String hex = Integer.toHexString(data[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
sb.append(hex);
if (addSpace)
sb.append(" ");
}
return sb.toString().trim();
}
}
How would I go about into converting this string so I can decimal values back?

You can use java.lang.Integer library's method parseInt.
simply do Integer.parseInt(hexString,16);
For more information you can refer to documentation here.

I was confused as I somehow thought bytes had to be displayed in hexadecimal value. It didn't cross my mind that I could just showcase two bytes in decimal value. Currently have what I want with the following code:
public class HexUtil {
public static String formatDecimalString(byte[] data, boolean addSpace) {
if (data == null || data.length < 1)
return null;
int negative = data[0] < 0 ? -1 : 1;
BigInteger bigInteger = new BigInteger(negative, data);
String decimal = bigInteger.toString();
if(addSpace) {
decimal = decimal.replaceAll("(.{2})", "$1 ");
}
return decimal;
}
}

Related

Java NumberFormat.getNumberInstance(Locale) inconsistent for negativePrefix

Trying to format negative number to String using:
(DecimalFormat) NumberFormat.getNumberInstance(new Locale("no")));
Using jdk-10.0.2. I have found out that Norway and some other countries are using Unicode Character 'MINUS SIGN' (U+2212) for negative prefix, while most other countries are using Unicode Character 'HYPHEN-MINUS' (U+002D). This is a problem as test are failing on equal and on my Mac all negative prefix is HYPHEN-MINUS.
A solution I have found is to call setNegativePrefix("-") after getting the DecimalFormat to override the strange local negative prefixes.
Please also see workaround at Orcale (end of page) https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8214926.
#Test
public void norwegianNegativePrefixDifferentFromEnglish() throws UnsupportedEncodingException {
Assertions.assertThat(((DecimalFormat) NumberFormat.getNumberInstance(new Locale("no"))).getNegativePrefix())
.isEqualTo(((DecimalFormat) NumberFormat.getNumberInstance(new Locale("en"))).getNegativePrefix());
}
Anyone know why? Executing this Java gives the attached results:
public void fintLocals() {
HashMap<String, List<String>> negativeSignAndLocals = new HashMap<String, List<String>>();
for (Locale locale : Locale.getAvailableLocales()) {
DecimalFormat formatForLocal = ((DecimalFormat) NumberFormat.getNumberInstance(locale));
// System.out.println(formatForLocal.getNegativePrefix()+ " minus for "+locale);
List<String> negLoc = negativeSignAndLocals.get(formatForLocal.getNegativePrefix());
if (negLoc == null) {
negativeSignAndLocals.put(formatForLocal.getNegativePrefix(), new ArrayList<>());
}
negativeSignAndLocals.get(formatForLocal.getNegativePrefix()).add(locale.toString());
}
for (Map.Entry<String, List<String>> entry : negativeSignAndLocals.entrySet()) {
System.out.println("Negative sign = " + entry.getKey() + " as Hex value " + charToHex(entry.getKey().charAt(0))
+ " are used by: " + (String) String.join(",", entry.getValue()));
}
}
static public String byteToHex(byte b) {
// Returns hex String representation of byte b
char hexDigit[] = {
'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
};
char[] array = {hexDigit[(b >> 4) & 0x0f], hexDigit[b & 0x0f]};
return new String(array);
}
static public String charToHex(char c) {
// Returns hex String representation of char c
byte hi = (byte) (c >>> 8);
byte lo = (byte) (c & 0xff);
return byteToHex(hi) + byteToHex(lo);
}
Negative sign − as Hex value 2212 are used by: nn,sv_SE,sv,se_NO,nb_SJ,no_NO_NY,sv_FI,no,ksh,gsw_CH,et,gsw,gsw_FR,fi,et_EE,rm,nb_NO,fi_FI,rm_CH,ksh_DE,se_FI,no_NO,lt_LT,nn_NO,se_SE,se,fo_DK,fo_FO,fo,lt,gsw_LI,sv_AX,nb
Negative sign - as Hex value 002d are used by: ,bg,kea,zu,am_ET,fr_DZ,ti_ET,bo_CN,hsb,qu_EC,ta_SG,lv,en_NU,zh_SG_#Hans,en_MS,en_GG,en_JM,vo,kkj,sr_ME,es_BO,dz_BT,mer,sah,en_ZM,fr_ML,br,ha_NG,bs_BA,dsb_DE,sk,os_GE,ml,en_MT,en_LR,en_GH,en_IL,cs,el,tzm_MA,af,sw_UG,ses_ML,smn,tk_TM,sr_ME_#Cyrl,dsb,lkt_US,vai_LR_#Latn,ji_001,yo_NG,khq,sw_CD,vo_001,en_PW,pl_PL,fil_PH,sr_CS,ne_IN,es_PH,es_ES,es_CO,bg_BG,ji,bs_BA_#Latn,en_VC,es_US,agq,hsb_DE,en_US_POSIX,en_150,en_KN,ha_NE,pt_MO,ebu,ro_RO,zh__#Hans,lb_LU,sr_ME_#Latn,es_GT,so_KE,dje_NE,bas_CM,fr_PM,fr_MG,es_CL,mn,agq_CM,kam_KE,teo,tr_TR,eu,en_MO,shi__#Tfng,en_BZ,sq_AL,es_DO,ru,twq_NE,az,nmg_CM,kl_GL,en_NR,nd,kk,az__#Cyrl,en_MP,en_GD,tk,hy,shi__#Latn,en_BW,en_AU,en_CY,kab_DZ,kde_TZ,ta_MY,ti_ER,nus_SS,en_RW,nd_ZW,ksb,luo,lb,ne,en_IE,zh_SG,ln_CD,en_KI,nnh_CM,om_ET,ja_JP,my,ka,mgh,or_IN,fr_MF,shi,kl,yue_HK,en_SZ,rwk_TZ,zh,es_PE,mgh_MZ,saq,az__#Latn,ta,en_GB,lag,zh_HK_#Hant,ksf_CM,bo,kk_KZ,es_PA,om_KE,en_AS,fr_VU,zh_TW,bez,kln,fr_MC,kw,pt_MZ,fr_NE,vai__#Latn,ksb_TZ,ln,en_JE,ln_CF,uz_AF,en_CX,luy_KE,pt,en_AT,gl,kkj_CM,sr__#Cyrl,es_GQ,kn_IN,to,en_SX,ga,qu,ru_KZ,en_TZ,en_PR,mua,ko_KP,in,sn,nl_SR,rof,en_BS,km,zgh,fr_NC,be,gv,es,dua,gd_GB,jgo,nl_BQ,fr_CM,uz_UZ_#Cyrl,pa_IN_#Guru,en_KE,guz,mfe,asa_TZ,teo_UG,ja,fr_SN,or,brx,fr_MA,pt_LU,fr_BL,en_NL,mgo_CM,ln_CG,te,az_AZ,sl,ko_KR,el_CY,mr_IN,ha,es_MX,es_HN,hu_HU,ff_SN,sbp,sq_MK,sr_BA_#Cyrl,uz,bs__#Cyrl,sr__#Latn,en_SS,sw,bo_IN,fy_NL,tr_CY,nmg,en_MG,fr_BI,shi_MA,uz_UZ_#Latn,bn,dua_CM,vai__#Vaii,kn,fr_TN,sr_RS,de_CH,bn_BD,nnh,fr_PF,en_ZA,gu,pt_GQ,vun_TZ,jmc_TZ,en_TV,lo,fr_FR,en_PN,pa_IN,en_MH,fr_BJ,vai_LR,zh__#Hant,cu_RU,zh_HK_#Hans,nl_NL,sah_RU,en_GY,bs__#Latn,ky,mas,dyo_SN,os,bs_BA_#Cyrl,nl_CW,sk_SK,pt_CH,fr_GQ,ff_CM,am,en_NG,fr_CI,ki_KE,en_PK,zh_CN,en_LC,rw,brx_IN,gv_IM,mk_MK,en_TT,dav,sl_SI,fr_HT,te_IN,nl_SX,ses,ce,fr_CG,fr_BE,jgo_CM,mt_MT,es_VE,mg,mr,mer_KE,ko,en_BM,ak,seh,kde,dz,kea_CV,mgo,vi_VN,en_VU,en_US,to_TO,mfe_MU,seh_MZ,fr_BF,pa__#Guru,it_SM,fr_YT,gu_IN,ii_CN,ast,fr_RE,ca_FR,sr_BA_#Latn,bn_IN,fr_GP,pa,zgh_MA,uk_UA,fr_DJ,rn,rwk,hu,fr_CH,en_NF,twq,ha_GH,sr_XK_#Cyrl,bm,en_GU,nl_AW,de_BE,en_AI,en_CM,xog_UG,cs_CZ,tr,ca_ES,cgg,nyn_UG,ru_MD,ms_MY,ta_LK,ksf,en_TO,cy,en_PG,fr_CF,pt_TL,sq,fr,en_ER,qu_PE,sr_BA,es_PY,de,es_EC,kok_IN,lg_UG,zu_ZA,fr_TG,sr_XK_#Latn,en_PH,ig_NG,fr_GN,prg_001,cgg_UG,zh_MO_#Hans,lg,ru_RU,ff,en_DM,en_CK,ga_IE,en_BI,en_AG,fr_TD,en_WS,fr_LU,ebu_KE,bem_ZM,xog,ewo_CM,fr_CD,so,rn_BI,en_NA,kab,ms,nus,sn_ZW,prg,ug,es_EA,th_TH_TH_#u-nu-thai,hi,fr_SC,ca_IT,lag_TZ,en_SL,teo_KE,ca_AD,zh_MO_#Hant,en_SH,vai,qu_BO,haw_US,vi,fr_CA,de_LU,sq_XK,dyo,en_KY,mt,it_CH,de_DE,si_LK,luo_KE,en_DK,yav,so_DJ,it_IT,eo,kam,en_ZW,ro,eo_001,ee,en_UM,fr_MU,pl,en_TK,en_SI,mua_CM,vai_LR_#Vaii,saq_KE,pt_GW,lo_LA,chr,af_ZA,ms_SG,ee_TG,ln_AO,be_BY,ff_GN,in_ID,hr_HR,luy,as,rof_TZ,it,pt_CV,uk,my_MM,mn_MN,da_DK,en_FM,es_PR,wae_CH,en_BE,ii,fr_WF,ru_BY,naq,en_SG,ee_GH,kln_KE,tzm,fur,om,hi_IN,en_CH,asa,yo_BJ,ast_ES,fr_KM,bez_TZ,fr_MQ,en_SD,es_AR,en_MY,ja_JP_JP_#u-ca-japanese,es_SV,pt_BR,ml_IN,sbp_TZ,fil,en_FK,uz__#Cyrl,is_IS,hy_AM,en_GM,en_DG,ne_NP,hr,pt_ST,ak_GH,fur_IT,ta_IN,en_SE,fr_GF,lkt,zh_CN_#Hans,is,es_419,si,pt_AO,en_001,en,guz_KE,es_IC,ca,ru_KG,fr_MR,zh_TW_#Hant,bm_ML,pa_PK,kw_GB,ug_CN,as_IN,es_BR,zh_HK,khq_ML,sw_KE,en_SB,th_TH,rw_RW,chr_US,shi_MA_#Tfng,nyn,yue,jmc,en_MW,naq_NA,mk,en_IO,en_DE,en_CC,bs,ro_MD,en_FI,pt_PT,fy,az_AZ_#Cyrl,th,dav_KE,uz_UZ,shi_MA_#Latn,es_CU,en_SC,en_VI,haw,eu_ES,en_UG,en_NZ,dje,es_UY,bas,mas_KE,ru_UA,sg_CF,el_GR,yav_CM,uz__#Latn,sg,da_GL,en_FJ,de_LI,en_BB,km_KH,smn_FI,hr_BA,de_AT,nl,lu_CD,ca_ES_VALENCIA,so_SO,lv_LV,es_CR,fr_GA,sr,sr_RS_#Cyrl,bem,en_MU,da,wae,gl_ES,en_IM,az_AZ_#Latn,en_LS,ig,en_HK,en_GI,ce_RU,en_CA,gd,ka_GE,fr_SY,sw_TZ,fr_RW,so_ET,nl_BE,mg_MG,cy_GB,en_VG,cu,os_RU,sr_RS_#Latn,en_TC,ky_KG,af_NA,vun,en_IN,lu,ki,yo,es_NI,ff_MR,mas_TZ,ti,kok,ewo,ms_BN,br_FR
Negative sign ‎ as Hex value 200e are used by: fa_AF,ar_EH,fa_IR,ar_MR,fa,ur_IN,ps,lrc_IR,lrc_IQ,ps_AF,ar_DZ,iw,lrc,pa_PK_#Arab,ar_MA,iw_IL,ur,uz__#Arab,ar_LB,ks_IN,ur_PK,mzn,mzn_IR,uz_AF_#Arab,ar_TN,ks,pa__#Arab,ar_LY
Negative sign ‏ as Hex value 200f are used by: ar_JO,ar_SA,ar_TD,ar_EG,ar_SD,ar_KM,ar_IL,ar_SY,ar_PS,ar_YE,ar_OM,ar_SS,ar_ER,ar_SO,ar_AE,ar_BH,ar_IQ,ar_QA,ckb_IQ,ar,ckb_IR,ar_001,ckb,ar_KW,ar_DJ

Why am I getting "illegal start of expression" for char array and "class, interface, or enum expected" for the method?

I am trying to create a program that shuffles a deck of cards in character array form. Here is my code. Problem is that it compiles with "illegal start of expression" for the deck array,as well as other errors,and "class, interface, or enum expected" for the hasRemaining method:
public class Blackjack
{
public static void main(String args[])
{
char[] deck = new char[]{'A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K','A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K','A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K'};
char[] deck2 = new char[52];
int i = 0;
while (hasRemaining(deck))
{
Random rand = new Random();
int r = rand.nextInt(52);
if (deck[r] != '-1')
{
deck2[i] = deck[r];
deck[r] = -1;
i++;
}
}
System.out.println(deck2);
}
public boolean hasRemaining(char[] c)
{
for (int i = 0; i < c.length; i++)
{
if (c[i] != '-1')
return true;
}
return false;
}
}
Both '10' and '-1' are invalid character constants. That causes the compilation issue.

Generate a Secure Random Password in Java with Minimum Special Character Requirements

How do I create a random password that meets the system's length and character set requirements in Java?
I have to create a random password that is 10-14 characters long and has at least one uppercase, one lowercase, and one special character. Unfortunately, some special characters are too special and cannot be used, so I cannot use just printed ASCII.
Many of the examples on this site generate a random password or session key without enough entropy in the characters or without realistic requirements in a business setting like the ones given above, so I'm asking more pointed question to get a better answer.
My character set, every special character on a standard US keyboard except for a space:
A-Z
a-z
0-9
~`!##$%^&*()-_=+[{]}\|;:'",<.>/?
I suggest using apache commons RandomStringUtils. Use something what is already done.
String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789~`!##$%^&*()-_=+[{]}\\|;:\'\",<.>/?";
String pwd = RandomStringUtils.random( 15, characters );
System.out.println( pwd );
If you are using maven
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
otherwise download jar
UPDATE
Version with secure random. So matter of required characters left and can be solved as in comment, generate required parts separately and normal ones. Then join them randomly.
char[] possibleCharacters = (new String("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789~`!##$%^&*()-_=+[{]}\\|;:\'\",<.>/?")).toCharArray();
String randomStr = RandomStringUtils.random( randomStrLength, 0, possibleCharacters.length-1, false, false, possibleCharacters, new SecureRandom() );
System.out.println( randomStr );
I recently learned about Passay. It provides the required functionality needed in its PasswordGenerator class. It randomly generates passwords meeting the requirements similar to what is written below using CharacterRules rather than PasswordCharacterSets as I have done below. Instead of holding a list of unused indexes for random character insertion, it simply shuffles the character buffer after inserting characters that meet the requirements.
Below is left over from before, I recommend using Passay if your licensing allows it, this code should work otherwise and provides details of why the generated passwords are crytographically strong
I ended up writing this code twice. Once to get a random character result, but it turned out the distribution of characters depended on the size of the character set(whoops!). I rewrote it and now you should just copy/paste the code and change the Main.java to the character sets you want. Although it could have been done differently, I think this is a relatively straightforward approach to get the correct result and I encourage reuse, comments, criticisms, and well-thought edits.
The controls of the PasswordGenerator code is as follows:
Min/Max Length: Set using a random number
PasswordCharacterSet: It is assumed that all PasswordCharacterSets passed into PasswordGenerator consist of unique character sets, if not, the random characters will have a skew towards the duplicates.
PasswordCharacterSet Min Characters: The min characters to use for this character set.
The main bits for the actual password generation:
Randomness of Random: We're using SecureRandom which is backed by a cryptographically strong PRNG, rather than the Random class which is not.
Random character order for the password: All the indexes of the pw char array are added to the remainingIndexes array. As we call addRandomCharacters, it removes an index randomly and we use the removed index to populate the array.
Random characters: In addRandomCharacters, a random index from the character index we're using is chosen and added to the pw array.
Guaranteeing minimum characters of each type are set: We simply carve out the minimum character amount first. We choose the minimum amount of random values from each character set and then move on.
Random distribution for the remaining characters: After the minimum values have been set, we want to make the rest of the characters random across all character sets. All the characters are added to a single array. The remaining slots are filled using the same strategy for the previous character sets.
Description of password complexity: Password complexity is usually talked about in bits of entropy. Here are the number of possibilities for your keyspace:
There is at least one uppercase alpha character (out of 26), one lowercase alpha character(out of 26), one digit (out of 10), and one special character (out of 32), the way you calculate the number of possibilities is the number of possibilities for each character multiplied by the number of characters since they are randomly placed in the string. So we know the possibilities for four of the characters are:
Required Characters = 26*26*10*32=216,320
All remaining characters have 94 (26+26+10+32) possibilities each
Our calculation is:
Characters Possibilities Bits of Entropy
10 chars 216,320*94^6 = 149,232,631,038,033,920 ~2^57
11 chars 216,320*94^7 = 14,027,867,317,575,188,480 ~2^63
12 chars 216,320*94^8 = 1,318,619,527,852,067,717,120 ~2^70
13 chars 216,320*94^9 = 123,950,235,618,094,365,409,280 ~2^76
14 chars 216,320*94^10 = 11,651,322,148,100,870,348,472,320 ~2^83
With this is mind, if you want the most secure passwords, you should always choose the highest amount of characters possible which is 14 in this case.
Main.java
package org.redtown.pw;
import java.util.EnumSet;
import java.util.HashSet;
import java.util.Set;
import org.redtown.pw.PasswordGenerator.PasswordCharacterSet;
public class Main {
public static void main(String[] args) {
Set<PasswordCharacterSet> values = new HashSet<PasswordCharacterSet>(EnumSet.allOf(SummerCharacterSets.class));
PasswordGenerator pwGenerator = new PasswordGenerator(values, 10, 14);
for(int i=0; i < 10; ++i) {
System.out.println(pwGenerator.generatePassword());
}
}
private static final char[] ALPHA_UPPER_CHARACTERS = { 'A', 'B', 'C', 'D',
'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q',
'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };
private static final char[] ALPHA_LOWER_CHARACTERS = { 'a', 'b', 'c', 'd',
'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q',
'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };
private static final char[] NUMERIC_CHARACTERS = { '0', '1', '2', '3', '4',
'5', '6', '7', '8', '9' };
private static final char[] SPECIAL_CHARACTERS = { '~', '`', '!', '#', '#',
'$', '%', '^', '&', '*', '(', ')', '-', '_', '=', '+', '[', '{',
']', '}', '\\', '|', ';', ':', '\'', '"', ',', '<', '.', '>', '/',
'?' };
private enum SummerCharacterSets implements PasswordCharacterSet {
ALPHA_UPPER(ALPHA_UPPER_CHARACTERS, 1),
ALPHA_LOWER(ALPHA_LOWER_CHARACTERS, 1),
NUMERIC(NUMERIC_CHARACTERS, 1),
SPECIAL(SPECIAL_CHARACTERS, 1);
private final char[] chars;
private final int minUsage;
private SummerCharacterSets(char[] chars, int minUsage) {
this.chars = chars;
this.minUsage = minUsage;
}
#Override
public char[] getCharacters() {
return chars;
}
#Override
public int getMinCharacters() {
return minUsage;
}
}
}
PasswordGenerator.java
package org.redtown.pw;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Random;
public class PasswordGenerator {
private final List<PasswordCharacterSet> pwSets;
private final char[] allCharacters;
private final int minLength;
private final int maxLength;
private final int presetCharacterCount;
public PasswordGenerator(Collection<PasswordCharacterSet> origPwSets, int minLength, int maxLength) {
this.minLength = minLength;
this.maxLength = maxLength;
// Make a copy of the character arrays and min-values so they cannot be changed after initialization
int pwCharacters = 0;
int preallocatedCharacters = 0;
List<PasswordCharacterSet> pwSets = new ArrayList<PasswordCharacterSet>(origPwSets.size());
for(PasswordCharacterSet origpwSet : origPwSets) {
PasswordCharacterSet newPwSet = new PwSet(origpwSet);
pwSets.add(newPwSet);
pwCharacters += newPwSet.getCharacters().length;
preallocatedCharacters += newPwSet.getMinCharacters();
}
this.presetCharacterCount = preallocatedCharacters;
this.pwSets = Collections.unmodifiableList(pwSets);
if (minLength < presetCharacterCount) {
throw new IllegalArgumentException("Combined minimum lengths "
+ presetCharacterCount
+ " are greater than the minLength of " + minLength);
}
// Copy all characters into single array so we can evenly access all members when accessing this array
char[] allChars = new char[pwCharacters];
int currentIndex = 0;
for(PasswordCharacterSet pwSet : pwSets) {
char[] chars = pwSet.getCharacters();
System.arraycopy(chars, 0, allChars, currentIndex, chars.length);
currentIndex += chars.length;
}
this.allCharacters = allChars;
}
public char[] generatePassword() {
SecureRandom rand = new SecureRandom();
// Set pw length to minLength <= pwLength <= maxLength
int pwLength = minLength + rand.nextInt(maxLength - minLength + 1);
int randomCharacterCount = pwLength - presetCharacterCount;
// Place each index in an array then remove them randomly to assign positions in the pw array
List<Integer> remainingIndexes = new ArrayList<Integer>(pwLength);
for(int i=0; i < pwLength; ++i) {
remainingIndexes.add(i);
}
// Fill pw array
char[] pw = new char[pwLength];
for(PasswordCharacterSet pwSet : pwSets) {
addRandomCharacters(pw, pwSet.getCharacters(), pwSet.getMinCharacters(), remainingIndexes, rand);
}
addRandomCharacters(pw, allCharacters, randomCharacterCount, remainingIndexes, rand);
return pw;
}
private static void addRandomCharacters(char[] pw, char[] characterSet,
int numCharacters, List<Integer> remainingIndexes, Random rand) {
for(int i=0; i < numCharacters; ++i) {
// Get and remove random index from the remaining indexes
int pwIndex = remainingIndexes.remove(rand.nextInt(remainingIndexes.size()));
// Set random character from character index to pwIndex
int randCharIndex = rand.nextInt(characterSet.length);
pw[pwIndex] = characterSet[randCharIndex];
}
}
public static interface PasswordCharacterSet {
char[] getCharacters();
int getMinCharacters();
}
/**
* Defensive copy of a passed-in PasswordCharacterSet
*/
private static final class PwSet implements PasswordCharacterSet {
private final char[] chars;
private final int minChars;
public PwSet(PasswordCharacterSet pwSet) {
this.minChars = pwSet.getMinCharacters();
char[] pwSetChars = pwSet.getCharacters();
// Defensive copy
this.chars = Arrays.copyOf(pwSetChars, pwSetChars.length);
}
#Override
public char[] getCharacters() {
return chars;
}
#Override
public int getMinCharacters() {
return minChars;
}
}
}
Here is a utility that uses just vanilla Java and implements the requirements. It basically gets one of each of the required character sets. Then populates the rest with random chars from the whole set. Then shuffles it all up.
public class PasswordUtils {
static char[] SYMBOLS = "^$*.[]{}()?-\"!##%&/\\,><':;|_~`".toCharArray();
static char[] LOWERCASE = "abcdefghijklmnopqrstuvwxyz".toCharArray();
static char[] UPPERCASE = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
static char[] NUMBERS = "0123456789".toCharArray();
static char[] ALL_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789^$*.[]{}()?-\"!##%&/\\,><':;|_~`".toCharArray();
static Random rand = new SecureRandom();
public static String getPassword(int length) {
assert length >= 4;
char[] password = new char[length];
//get the requirements out of the way
password[0] = LOWERCASE[rand.nextInt(LOWERCASE.length)];
password[1] = UPPERCASE[rand.nextInt(UPPERCASE.length)];
password[2] = NUMBERS[rand.nextInt(NUMBERS.length)];
password[3] = SYMBOLS[rand.nextInt(SYMBOLS.length)];
//populate rest of the password with random chars
for (int i = 4; i < length; i++) {
password[i] = ALL_CHARS[rand.nextInt(ALL_CHARS.length)];
}
//shuffle it up
for (int i = 0; i < password.length; i++) {
int randomPosition = rand.nextInt(password.length);
char temp = password[i];
password[i] = password[randomPosition];
password[randomPosition] = temp;
}
return new String(password);
}
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
System.out.println(getPassword(8));
}
}
}
Using the random functionality of java.util package of rt.jar, we can create a random password of any length. below is the snippet for the same.
public class GeneratePassword {
public static void main(String[] args)
{
int length = 10;
String symbol = "-/.^&*_!#%=+>)";
String cap_letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
String small_letter = "abcdefghijklmnopqrstuvwxyz";
String numbers = "0123456789";
String finalString = cap_letter + small_letter +
numbers + symbol;
Random random = new Random();
char[] password = new char[length];
for (int i = 0; i < length; i++)
{
password[i] =
finalString.charAt(random.nextInt(finalString.length()));
}
System.out.println(password);
}
}
I know it is an old question, but maybe my solution will help someone with the same problem.
I'm using RandomStringUtils for password generator and then I check did password fulfilled conditions (at least one symbol, one capital letter, one small letter and one number and 8 characters long) with regex and if it didn't then I call again password generator with recursion until condition is not fulfilled. I can say that method is not gonna be called more than 3 times for sure!
public String generatePassword() {
String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789#!#$%&";
String password = RandomStringUtils.random( 8, characters );
String regex = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[#!#$%&])(?=\\S+$).{8,}$";
Pattern pattern = Pattern.compile( regex );
Matcher matcher = pattern.matcher( password );
if (matcher.matches()) {
return password;
} else {
return generatePassword(); // recursion
}
}
Maven dependency:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.11</version>
</dependency>
public static final Character[] ALPHA_UPPER_CHARACTERS = {'A', 'B', 'C', 'D',
'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q',
'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
public static final Character[] ALPHA_LOWER_CHARACTERS = {'a', 'b', 'c', 'd',
'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q',
'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
public static final Character[] NUMERIC_CHARACTERS = {'0', '1', '2', '3', '4',
'5', '6', '7', '8', '9'};
public static final Character[] SPECIAL_CHARACTERS = {'#', '#',
'$', '%', '^', '&', '*', '|', ';', ':', '?'};
**Note: I copied char set from #summer**
final List<Character[]> charSets = new ArrayList<>();
charSets.add(Constant.ALPHA_UPPER_CHARACTERS);
charSets.add(Constant.ALPHA_LOWER_CHARACTERS);
charSets.add(Constant.NUMERIC_CHARACTERS);
charSets.add(Constant.SPECIAL_CHARACTERS);
public String getFilterPassword() {
StringBuilder passBuilder = new StringBuilder();
final int charSetLen = charSets.size();
for (int i = 0; i < 10; i++) {
int randomLength = new Random().nextInt(charSetLen - 1);
Character[] newAlpha = charSets.get(randomLength);
int randomSetLen = newAlpha.length;
int randomAlphaLen = new Random().nextInt(randomSetLen - 1);
passBuilder.append(newAlpha[randomAlphaLen]);
}
return passBuilder.toString();
}

Errors that don't exist

Umm. This is awkward but I'm getting some errors that say stuff that is totally untrue.
Could someone give me a suggestion on how to fix it. I'm new to java so simple answers would be the best.
Thanks.
public class Project1
{
public static void main( String [] args )
{
System.out.println();
String output = new String();
String inital = new String();
inital = english_to_morse();
for( int k = 0; k < inital.length(); k++)
{
output += morse(inital.charAt( k ));
}
System.out.print(output);
System.out.println();
}
public static void choice()
{
int user_choice = 0; ///This is the method giving me grief!!!!!!
user_choice = Input.getInt("Enter 1 if you want to change English to Morse code, and enter 2 to change Morse code to English");
if(user_choice == 1)
{
english_to_morse();
}
if(user_choice == 2)
{
morse_to_english();
}
public static String english_to_morse()
{
String user_input = new String();
user_input = Input.getString("Enter a phrase and I'll convert it to Morse Code");
return user_input.toLowerCase();
}
public static String morse_to_english()
{
String user_input = new String();
user_input = Input.getString("Enter a phrase in Morse Code and I'll convert it to English");
return user_input.toLowerCase();
}
public static String morse(char letter)
{
String output = new String();
char[] alphabet_numbers = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ' ' };
String morse_code[] = { ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", "-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----.", "|" };
for( int j = 0; j < alphabet_numbers.length; j++ )
{
if (alphabet_numbers[j]==letter)
{
output = morse_code[j];
}
}
return output + " ";
}
}
This is the problem:
public static void choice()
{
int user_choice = 0; ///This is the method giving me grief!!!!!!
user_choice = Input.getInt("Enter 1 if you want to change English to Morse code, and enter 2 to change Morse code to English");
if(user_choice == 1)
{
english_to_morse();
}
if(user_choice == 2)
{
morse_to_english();
}
public static String english_to_morse()
You never finish the choice() method - so you can't start the english_to_morse method.
I strongly suspect that the first error message from the compiler was at the start of the english_to_morse method. Once you're source is that broken (trying to declare one method inside another) it shouldn't be a surprise that other error messages may seem strange.
It's a good idea to:
Compile often, and fix problems as soon as they occur. Then if you suddenly get a slew of errors, you know that it can only be due to what you've done very recently.
A huge number of errors is usually due to something like this - look at the first error message, or at least where you start getting a lot of errors, and that can often find the problem.
Getting the IDE to format your code can help you find missing braces too.

Trying to write a decryption function in Java

I'm finished with the plugin finally, and started working on another project. That project is a simple bit of software to encrypt a string given an encryption key and the string itself. So I wrote that, and it seems to be working fine, but I can't figure out how to decrypt it. I used to have an array with the encrypted alphabet, but I figured out a way to do without that in the encryption function and there should be a way to do without it in the decryption as well.
My encryption function:
public static String e(String toEncrypt, int encKey) {
encKey %= ALPHABET.length;
toEncrypt = toEncrypt.toLowerCase();
char[] TEChar = toEncrypt.toCharArray();
for (int i = 0; i < toEncrypt.length(); i++) {
for (int j = 0; j < ALPHABET.length; j++) {
if (TEChar[i] == '`') {
TEChar[i] = '_';
}
else if (TEChar[i] == ALPHABET[j]) {
TEChar[i] = ALPHABET[(j + encKey) % ALPHABET.length];
break;
}
}
}
toEncrypt = String.valueOf(TEChar) + "`" + encKey;
return toEncrypt;
}
ALPHABET (the array, and I realize that it contains more than just the alphabet.):
char[] ALPHABET = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', ' ', '1',
'2', '3', '4', '5', '6', '7', '8', '9', '0', ',', '.', ';', ':', '[', ']', '{',
'}', '?'};
Rather than making a new array just to have the offset characters, I did that with a simple addition and use of the remainder operator. I tried using subtraction and the same thing, but it didn't work as I would need it to wrap around to 26. Somehow I get the feeling that something glaringly obvious is the solution.
Try this:
public static String e(String toEncrypt, int encKey, boolean addEncKey) {
encKey %= ALPHABET.length;
toEncrypt = toEncrypt.toLowerCase();
char[] TEChar = toEncrypt.toCharArray();
for (int i = 0; i < toEncrypt.length(); i++) {
for (int j = 0; j < ALPHABET.length; j++) {
if (TEChar[i] == '`') {
TEChar[i] = '_';
} else if (TEChar[i] == ALPHABET[j]) {
TEChar[i] = ALPHABET[(j + encKey + ALPHABET.length)
% ALPHABET.length];
break;
}
}
}
if (addEncKey) {
toEncrypt = String.valueOf(TEChar) + "`" + encKey;
} else {
toEncrypt = String.valueOf(TEChar);
}
return toEncrypt;
}
This how I tested it:
public static void main(String[] args) {
String encoded = e("ABDSDfz}", 2, true);
System.out.println(encoded);
String decoded = e(
encoded.substring(0, encoded.indexOf("`")),
-Integer.parseInt(encoded.substring(encoded.indexOf("`") + 1)),
false);
System.out.println(decoded);
}
As you can see I moved some logic to method invocation (you can easily write a decryption function that wrapes around encryption like this:
public static String decrypt(String encoded) {
return e(encoded.substring(0, encoded.indexOf("`")),
-Integer.parseInt(encoded.substring(encoded.indexOf("`") + 1)),
false);
}
The decrypion and encryption works basically in the same way but decryption uses opposite encKey (for example instead of 22 it will use -22), this done in invocation. You add encKey after '`' sign - I didn't wanted that in decoded message so I cut it out when parsing encoded string to method and added booleam parameter addEncKey so I can disable adding addEncKey.
I also changed in the code this line:
TEChar[i] = ALPHABET[(j + encKey + ALPHABET.length)
% ALPHABET.length];
This is an easy way to deal with negative indexes that can happen when encKey is negative.

Categories