// A little endian byte is the same as a big endian byte. But since we // can't write a method with the identifier byte() [byte is a type], we // use littleEndianByte() public static String littleEndianByte(String immediateOperand) { String littleEndianResult = littleEndianDword(immediateOperand); if (!(littleEndianResult.endsWith("000000") || littleEndianResult.endsWith("ffffff"))) { return "ERROR"; } return StrTools2.slice(littleEndianResult, 0, 2); }
public static String convertBinStringToHexPairs(String binaryString) { int maxLength = binaryString.length(); Map<String, Character> binToHexMapping = new HashMap<String, Character>(); binToHexMapping.put("0000", '0'); binToHexMapping.put("0001", '1'); binToHexMapping.put("0010", '2'); binToHexMapping.put("0011", '3'); binToHexMapping.put("0100", '4'); binToHexMapping.put("0101", '5'); binToHexMapping.put("0110", '6'); binToHexMapping.put("0111", '7'); binToHexMapping.put("1000", '8'); binToHexMapping.put("1001", '9'); binToHexMapping.put("1010", 'a'); binToHexMapping.put("1011", 'b'); binToHexMapping.put("1100", 'c'); binToHexMapping.put("1101", 'd'); binToHexMapping.put("1110", 'e'); binToHexMapping.put("1111", 'f'); String hexOutput = ""; for (int i = 0; i < maxLength; i += 4) { String binaryChunk = StrTools2.slice(binaryString, i, i + 4); hexOutput += binToHexMapping.get(binaryChunk); } return hexOutput; }
public static String littleEndianDword(int integer) { boolean isNegative = false; if (integer < 0) isNegative = true; String unsignedHexString; // .toHexString() automatically unsigns the integer. It will never // return a negative hexadecimal number. unsignedHexString = Integer.toHexString(integer); // We can't return numbers wider than a DWORD if (unsignedHexString.length() > 8) return "ERROR"; // We do not need to append 'f' to the beginning of the unsigned // hex string. Java does that for us. if (!isNegative) { while (unsignedHexString.length() < 8) { unsignedHexString = '0' + unsignedHexString; } } String littleEndianResult = StrTools2.slice(unsignedHexString, 6, 8) + StrTools2.slice(unsignedHexString, 4, 6) + StrTools2.slice(unsignedHexString, 2, 4) + StrTools2.slice(unsignedHexString, 0, 2); return littleEndianResult; }
public static byte[] hexToBytes(String hexString) throws MintException { if (!isEven(hexString.length())) { throw new MintException( "While trying to convert a hex string to bytes,\n" + "the number of hex digits is not divisible by 2." + "\n\n(Hex pairs are needed)"); } int elements = hexString.length() / 2; byte[] byteArray = new byte[elements]; int y = 0; for (int x = 0; x < elements; x++) { String hexPair = StrTools2.slice(hexString, y, y + 2); byte currentByte = (byte) Integer.parseInt(hexPair, 16); byteArray[x] = currentByte; y += 2; } return byteArray; }
public static String littleEndianDword(String immediateOperand) { if (immediateOperand.equals("-0")) return "00000000"; boolean isNegative = false; if (immediateOperand.startsWith("-")) { isNegative = true; } else if (immediateOperand.startsWith("+")) { // If the user idiotically put an unnecessary plus sign in front of // the number, accept it anyways. immediateOperand = StrTools2.slice(immediateOperand, 1); } String unsignedHexString; if (isNegative) { int signedNumber = 0; try { signedNumber = Integer.parseInt(immediateOperand, 16); } catch (NumberFormatException exceptionInfo) { return "ERROR"; } // .toHexString() automatically unsigns the integer. It will never // return a negative hexadecimal number. unsignedHexString = Integer.toHexString(signedNumber); // We can't return numbers wider than a DWORD if (unsignedHexString.length() > 8) return "ERROR"; // We do not need to append 'f' to the beginning of the unsigned // hex string. Java does that for us. } else { // The number we got must be positive. if (immediateOperand.length() > 8) { // This number is too long. Slice off the leading zeroes. while (immediateOperand.startsWith("0") && immediateOperand.length() > 8) { immediateOperand = StrTools2.slice(immediateOperand, 1); } // Even after all that work, we see that the number is not // full of leading zeroes but instead just doesn't fit into a // dword. if (immediateOperand.length() > 8) return "ERROR"; } while (immediateOperand.length() < 8) { // Zero extend the positive number. immediateOperand = "0" + immediateOperand; } unsignedHexString = immediateOperand; } String littleEndianResult = StrTools2.slice(unsignedHexString, 6, 8) + StrTools2.slice(unsignedHexString, 4, 6) + StrTools2.slice(unsignedHexString, 2, 4) + StrTools2.slice(unsignedHexString, 0, 2); return littleEndianResult; }