Decode value of base64 string in different language gives different output - base64
I have a base64 string like this
String value = "fefWUeQvPgBe/9QaG/RdPnn9PrzQK2VhVwBzAIr7eei9PQrZA2/sXTA/2SCodnTSJn4Lk+ve5kuPGjco4ljYrjNTsrKBAjN6APSHn0BqBce2lOZbm/z29U6j7j79niPbYl/UIc0VTjc0IgRhmNLn1eVvMTuoaGhlwlxUf/+xenC4NmEM2A6y5/DNRheNw6OrmHik/kowpWGQsRNFyXJ2VtzE54nqs9naePBkRlWna/oqBxzA/txtHXn8h/9xTT2caozcU5/R9JayFZq7ZeclzGs2DAACr1TyQwEb9JJpBXr04Zu4rlWLtnSbyflyK3lnSAocma0L6ENnCZoMiN8gUg=="
I used this method to decode string in java
Base64Utils.decode(value.getBytes())
output:125,-25,-42,81,-28,47,62,0,94,-1,-44,26,27,-12,93,62,121,-3,62,-68,-48,43,101,97,87,0,115,0,-118,-5,121,-24,-67,61,10,-39,3,111,-20,93,48,63,-39,32,-88,118,116,-46,38,126,11,-109,-21,-34,-26,75,-113,26,55,40,-30,88,-40,-82,51,83,-78,-78,-127,2,51,122,0,-12,-121,-97,64,106,5,-57,-74,-108,-26,91,-101,-4,-10,-11,78,-93,-18,62,-3,-98,35,-37,98,95,-44,33,-51,21,78,55,52,34,4,97,-104,-46,-25,-43,-27,111,49,59,-88,104,104,101,-62,92,84,127,-1,-79,122,112,-72,54,97,12,-40,14,-78,-25,-16,-51,70,23,-115,-61,-93,-85,-104,120,-92,-2,74,48,-91,97,-112,-79,19,69,-55,114,118,86,-36,-60,-25,-119,-22,-77,-39,-38,120,-16,100,70,85,-89,107,-6,42,7,28,-64,-2,-36,109,29,121,-4,-121,-1,113,77,61,-100,106,-116,-36,83,-97,-47,-12,-106,-78,21,-102,-69,101,-25,37,-52,107,54,12,0,2,-81,84,-14,67,1,27,-12,-110,105,5,122,-12,-31,-101,-72,-82,85,-117,-74,116,-101,-55,-7,114,43,121,103,72,10,28,-103,-83,11,-24,67,103,9,-102,12,-120,-33,32,82,
then I used this method to decode string in nodejs
Buffer.from(value, 'base64')
output:125,231,214,81,228,47,62,0,94,255,212,26,27,244,93,62,121,253,62,188,208,43,101,97,87,0,115,0,138,251,121,232,189,61,10,217,3,111,236,93,48,63,217,32,168,118,116,210,38,126,11,147,235,222,230,75,143,26,55,40,226,88,216,174,51,83,178,178,129,2,51,122,0,244,135,159,64,106,5,199,182,148,230,91,155,252,246,245,78,163,238,62,253,158,35,219,98,95,212,33,205,21,78,55,52,34,4,97,152,210,231,213,229,111,49,59,168,104,104,101,194,92,84,127,255,177,122,112,184,54,97,12,216,14,178,231,240,205,70,23,141,195,163,171,152,120,164,254,74,48,165,97,144,177,19,69,201,114,118,86,220,196,231,137,234,179,217,218,120,240,100,70,85,167,107,250,42,7,28,192,254,220,109,29,121,252,135,255,113,77,61,156,106,140,220,83,159,209,244,150,178,21,154,187,101,231,37,204,107,54,12,0,2,175,84,242,67,1,27,244,146,105,5,122,244,225,155,184,174,85,139,182,116,155,201,249,114,43,121,103,72,10,28,153,173,11,232,67,103,9,154,12,136,223,32,82
The java output is what I really want to get, why its different?
How can I correctly get decoded value in nodejs
Base64Utils.decode returns a signed 8 bit value in Java. Buffer.from returns an unsigned 8 bit value in Nodejs. While both return 8 bit (byte) values, the Java method interprets the high order bit as a negative number. Nodejs is unsigned.
var value = 'fefWUeQvPgBe/9QaG/RdPnn9PrzQK2VhVwBzAIr\
7eei9PQrZA2/sXTA/2SCodnTSJn4Lk+ve5kuPGj\
co4ljYrjNTsrKBAjN6APSHn0BqBce2lOZbm/z29\
U6j7j79niPbYl/UIc0VTjc0IgRhmNLn1eVvMTuo\
aGhlwlxUf/+xenC4NmEM2A6y5/DNRheNw6OrmHi\
k/kowpWGQsRNFyXJ2VtzE54nqs9naePBkRlWna/\
oqBxzA/txtHXn8h/9xTT2caozcU5/R9JayFZq7Z\
eclzGs2DAACr1TyQwEb9JJpBXr04Zu4rlWLtnSb\
yflyK3lnSAocma0L6ENnCZoMiN8gUg=='
buffervalue = Buffer.from(value, 'base64');
for (i=0; i < buffervalue.length; i++) {
y = buffervalue[i];
if (y > 127) {
y = -(256 - y);
}
console.log(y);
}
Related
Finding the binary composition of a binary number
Very new to C#, so this could be a silly question. I am working with alot of UInt64's. These are expressed as hex right? If we look at its binary representation, can we return such an array that if we apply the 'or' operation to, we will arrive back at the original UInt64? For example, let's say x = 1011 Then, I am looking for an efficient way to arrive at, f(x) = {1000, 0010, 0001} Where these numbers are in hex, rather than binary. Sorry, I am new to hex too. I have a method already, but it feels inefficient. I first convert to a binary string, and loop over that string to find each '1'. I then add the corresponding binary number to an array. Any thoughts? Here is a better example. I have a hexadecimal number x, in the form of, UInt64 x = 0x00000000000000FF Where the binary representation of x is 0000000000000000000000000000000000000000000000000000000011111111 I wish to find an array consisting of hexadecimal numbers (UInt64??) such that the or operation applied to all members of that array would result in x again. For example, f(x) = {0x0000000000000080, // 00000....10000000 0x0000000000000040, // 00000....01000000 0x0000000000000020, // 00000....00100000 0x0000000000000010, // 00000....00010000 0x0000000000000008, // 00000....00001000 0x0000000000000004, // 00000....00000100 0x0000000000000002, // 00000....00000010 0x0000000000000001 // 00000....00000001 } I think the question comes down to finding an efficient way to find the index of the '1's in the binary expansion... public static UInt64[] findOccupiedSquares(UInt64 pieces){ UInt64[] toReturn = new UInt64[BitOperations.PopCount(pieces)]; if (BitOperations.PopCount(pieces) == 1){ toReturn[0] = pieces; } else{ int i = 0; int index = 0; while (pieces != 0){ i += 1; pieces = pieces >> 1; if (BitOperations.TrailingZeroCount(pieces) == 0){ // One int rank = (int)(i / 8); int file = i - (rank * 8); toReturn[index] = LUTable.MaskRank[rank] & LUTable.MaskFile[file]; index += 1; } } } return toReturn; }
Your question still confuses me as you seem to be mixing the concepts of numbers and number representations. i.e. There is an integer and then there is a hexadecimal representation of that integer. You can very simply break any integer into its base-2 components. ulong input = 16094009876; // example input ulong x = 1; var bits = new List<ulong>(); do { if ((input & x) == x) { bits.Add(x); } x <<= 1; } while (x != 0); bits is now a list of integers which each represent one of the binary 1 bits within the input. This can be verified by adding (or ORing - same thing) all the values. So this expression is true: bits.Aggregate((a, b) => a | b) == input If you want hexadecimal representations of those integers in the list, you can simply use ToString(): var hexBits = bits.Select(b => b.ToString("X16")); If you want the binary representations of the integers, you can use Convert: var binaryBits = bits.Select(b => Convert.ToString((long)b, 2).PadLeft(64, '0'));
How to get the right values when I convert hex to ascii character
I'm trying to convert a hexa file to text, using javascript node js. function hex_to_ascii(str1){ var hex = str1.toString(); var str = ''; for (var n = 0; n < hex.length; n += 2) { str += String.fromCharCode(parseInt(hex.substr(n, 2), 16)); } return str; } I have a problem concening the extended ASCII charaters, so for example when I try to convert 93 I've get “ instead of ô and when I convert FF I've get ÿ instead of (nbsp) space. I want to get the same extended charaters as this table: https://www.rapidtables.com/code/text/ascii-table.html
This problem is slightly more complex than it seems at first, since you need to specify an encoding when converting from extended ascii to a string. For example Windows-1252, ISO-8859-1 etc. Since you wish to use the linked table, I'm assuming you wish to use CP437 encoding. To convert a buffer to string you need a module that will do this for you, converting from a buffer (in a given encoding) to string is not trivial unless the buffer is in a natively supported node.js encoding, e.g. UTF-8, ASCII (7-bit only!), Latin1 etc. I would suggest using the iconv-lite package, this will convert many types of encoding. Once this is installed the code should look as follows (this takes each character from 0x00 to 0xFF and prints the encoded character): const iconv = require('iconv-lite'); function hex_to_ascii(hexData, encoding) { const buffer = Buffer.from(hexData, "hex"); return iconv.decode(buffer, encoding); } const testInputs = [...Array(256).keys()]; const encoding = "CP437"; console.log("Decimal\tHex\tCharacter") for(let input of testInputs) { console.log([input, input.toString(16), hex_to_ascii(input.toString(16), encoding)].join("\t")); }
Call to MongoDB in Express fails when using varibles but work with literals [duplicate]
How do I convert a string to an integer in JavaScript?
The simplest way would be to use the native Number function: var x = Number("1000") If that doesn't work for you, then there are the parseInt, unary plus, parseFloat with floor, and Math.round methods. parseInt() var x = parseInt("1000", 10); // You want to use radix 10 // So you get a decimal number even with a leading 0 and an old browser ([IE8, Firefox 20, Chrome 22 and older][1]) Unary plus If your string is already in the form of an integer: var x = +"1000"; floor() If your string is or might be a float and you want an integer: var x = Math.floor("1000.01"); // floor() automatically converts string to number Or, if you're going to be using Math.floor several times: var floor = Math.floor; var x = floor("1000.01"); parseFloat() If you're the type who forgets to put the radix in when you call parseInt, you can use parseFloat and round it however you like. Here I use floor. var floor = Math.floor; var x = floor(parseFloat("1000.01")); round() Interestingly, Math.round (like Math.floor) will do a string to number conversion, so if you want the number rounded (or if you have an integer in the string), this is a great way, maybe my favorite: var round = Math.round; var x = round("1000"); // Equivalent to round("1000", 0)
Try parseInt function: var number = parseInt("10"); But there is a problem. If you try to convert "010" using parseInt function, it detects as octal number, and will return number 8. So, you need to specify a radix (from 2 to 36). In this case base 10. parseInt(string, radix) Example: var result = parseInt("010", 10) == 10; // Returns true var result = parseInt("010") == 10; // Returns false Note that parseInt ignores bad data after parsing anything valid. This guid will parse as 51: var result = parseInt('51e3daf6-b521-446a-9f5b-a1bb4d8bac36', 10) == 51; // Returns true
There are two main ways to convert a string to a number in JavaScript. One way is to parse it and the other way is to change its type to a Number. All of the tricks in the other answers (e.g., unary plus) involve implicitly coercing the type of the string to a number. You can also do the same thing explicitly with the Number function. Parsing var parsed = parseInt("97", 10); parseInt and parseFloat are the two functions used for parsing strings to numbers. Parsing will stop silently if it hits a character it doesn't recognise, which can be useful for parsing strings like "92px", but it's also somewhat dangerous, since it won't give you any kind of error on bad input, instead you'll get back NaN unless the string starts with a number. Whitespace at the beginning of the string is ignored. Here's an example of it doing something different to what you want, and giving no indication that anything went wrong: var widgetsSold = parseInt("97,800", 10); // widgetsSold is now 97 It's good practice to always specify the radix as the second argument. In older browsers, if the string started with a 0, it would be interpreted as octal if the radix wasn't specified which took a lot of people by surprise. The behaviour for hexadecimal is triggered by having the string start with 0x if no radix is specified, e.g., 0xff. The standard actually changed with ECMAScript 5, so modern browsers no longer trigger octal when there's a leading 0 if no radix has been specified. parseInt understands radixes up to base 36, in which case both upper and lower case letters are treated as equivalent. Changing the Type of a String to a Number All of the other tricks mentioned above that don't use parseInt, involve implicitly coercing the string into a number. I prefer to do this explicitly, var cast = Number("97"); This has different behavior to the parse methods (although it still ignores whitespace). It's more strict: if it doesn't understand the whole of the string than it returns NaN, so you can't use it for strings like 97px. Since you want a primitive number rather than a Number wrapper object, make sure you don't put new in front of the Number function. Obviously, converting to a Number gives you a value that might be a float rather than an integer, so if you want an integer, you need to modify it. There are a few ways of doing this: var rounded = Math.floor(Number("97.654")); // other options are Math.ceil, Math.round var fixed = Number("97.654").toFixed(0); // rounded rather than truncated var bitwised = Number("97.654")|0; // do not use for large numbers Any bitwise operator (here I've done a bitwise or, but you could also do double negation as in an earlier answer or a bit shift) will convert the value to a 32 bit integer, and most of them will convert to a signed integer. Note that this will not do want you want for large integers. If the integer cannot be represented in 32 bits, it will wrap. ~~"3000000000.654" === -1294967296 // This is the same as Number("3000000000.654")|0 "3000000000.654" >>> 0 === 3000000000 // unsigned right shift gives you an extra bit "300000000000.654" >>> 0 === 3647256576 // but still fails with larger numbers To work correctly with larger numbers, you should use the rounding methods Math.floor("3000000000.654") === 3000000000 // This is the same as Math.floor(Number("3000000000.654")) Bear in mind that coercion understands exponential notation and Infinity, so 2e2 is 200 rather than NaN, while the parse methods don't. Custom It's unlikely that either of these methods do exactly what you want. For example, usually I would want an error thrown if parsing fails, and I don't need support for Infinity, exponentials or leading whitespace. Depending on your use case, sometimes it makes sense to write a custom conversion function. Always check that the output of Number or one of the parse methods is the sort of number you expect. You will almost certainly want to use isNaN to make sure the number is not NaN (usually the only way you find out that the parse failed).
ParseInt() and + are different parseInt("10.3456") // returns 10 +"10.3456" // returns 10.3456
Fastest var x = "1000"*1; Test Here is little comparison of speed (macOS only)... :) For Chrome, 'plus' and 'mul' are fastest (>700,000,00 op/sec), 'Math.floor' is slowest. For Firefox, 'plus' is slowest (!) 'mul' is fastest (>900,000,000 op/sec). In Safari 'parseInt' is fastest, 'number' is slowest (but results are quite similar, >13,000,000 <31,000,000). So Safari for cast string to int is more than 10x slower than other browsers. So the winner is 'mul' :) You can run it on your browser by this link https://jsperf.com/js-cast-str-to-number/1 I also tested var x = ~~"1000";. On Chrome and Safari, it is a little bit slower than var x = "1000"*1 (<1%), and on Firefox it is a little bit faster (<1%).
I use this way of converting string to number: var str = "25"; // String var number = str*1; // Number So, when multiplying by 1, the value does not change, but JavaScript automatically returns a number. But as it is shown below, this should be used if you are sure that the str is a number (or can be represented as a number), otherwise it will return NaN - not a number. You can create simple function to use, e.g., function toNumber(str) { return str*1; }
Try parseInt. var number = parseInt("10", 10); //number will have value of 10.
I love this trick: ~~"2.123"; //2 ~~"5"; //5 The double bitwise negative drops off anything after the decimal point AND converts it to a number format. I've been told it's slightly faster than calling functions and whatnot, but I'm not entirely convinced. Another method I just saw here (a question about the JavaScript >>> operator, which is a zero-fill right shift) which shows that shifting a number by 0 with this operator converts the number to a uint32 which is nice if you also want it unsigned. Again, this converts to an unsigned integer, which can lead to strange behaviors if you use a signed number. "-2.123" >>> 0; // 4294967294 "2.123" >>> 0; // 2 "-5" >>> 0; // 4294967291 "5" >>> 0; // 5
In JavaScript, you can do the following: ParseInt parseInt("10.5") // Returns 10 Multiplying with 1 var s = "10"; s = s*1; // Returns 10 Using the unary operator (+) var s = "10"; s = +s; // Returns 10 Using a bitwise operator (Note: It starts to break after 2140000000. Example: ~~"2150000000" = -2144967296) var s = "10.5"; s = ~~s; // Returns 10 Using Math.floor() or Math.ceil() var s = "10"; s = Math.floor(s) || Math.ceil(s); // Returns 10
Please see the below example. It will help answer your question. Example Result parseInt("4") 4 parseInt("5aaa") 5 parseInt("4.33333") 4 parseInt("aaa"); NaN (means "Not a Number") By using parseint function, it will only give op of integer present and not the string.
Beware if you use parseInt to convert a float in scientific notation! For example: parseInt("5.6e-14") will result in 5 instead of 0
Also as a side note: MooTools has the function toInt() which is used on any native string (or float (or integer)). "2".toInt() // 2 "2px".toInt() // 2 2.toInt() // 2
We can use +(stringOfNumber) instead of using parseInt(stringOfNumber). Example: +("21") returns int of 21, like the parseInt("21"). We can use this unary "+" operator for parsing float too...
To convert a String into Integer, I recommend using parseFloat and not parseInt. Here's why: Using parseFloat: parseFloat('2.34cms') //Output: 2.34 parseFloat('12.5') //Output: 12.5 parseFloat('012.3') //Output: 12.3 Using parseInt: parseInt('2.34cms') //Output: 2 parseInt('12.5') //Output: 12 parseInt('012.3') //Output: 12 So if you have noticed parseInt discards the values after the decimals, whereas parseFloat lets you work with floating point numbers and hence more suitable if you want to retain the values after decimals. Use parseInt if and only if you are sure that you want the integer value.
There are many ways in JavaScript to convert a string to a number value... All are simple and handy. Choose the way which one works for you: var num = Number("999.5"); //999.5 var num = parseInt("999.5", 10); //999 var num = parseFloat("999.5"); //999.5 var num = +"999.5"; //999.5 Also, any Math operation converts them to number, for example... var num = "999.5" / 1; //999.5 var num = "999.5" * 1; //999.5 var num = "999.5" - 1 + 1; //999.5 var num = "999.5" - 0; //999.5 var num = Math.floor("999.5"); //999 var num = ~~"999.5"; //999 My prefer way is using + sign, which is the elegant way to convert a string to number in JavaScript.
Try str - 0 to convert string to number. > str = '0' > str - 0 0 > str = '123' > str - 0 123 > str = '-12' > str - 0 -12 > str = 'asdf' > str - 0 NaN > str = '12.34' > str - 0 12.34 Here are two links to compare the performance of several ways to convert string to int https://jsperf.com/number-vs-parseint-vs-plus http://phrogz.net/js/string_to_number.html
Here is the easiest solution let myNumber = "123" | 0; More easy solution let myNumber = +"123";
In my opinion, no answer covers all edge cases as parsing a float should result in an error. function parseInteger(value) { if(value === '') return NaN; const number = Number(value); return Number.isInteger(number) ? number : NaN; } parseInteger("4") // 4 parseInteger("5aaa") // NaN parseInteger("4.33333") // NaN parseInteger("aaa"); // NaN
The easiest way would be to use + like this const strTen = "10" const numTen = +strTen // string to number conversion console.log(typeof strTen) // string console.log(typeof numTen) // number
I actually needed to "save" a string as an integer, for a binding between C and JavaScript, so I convert the string into an integer value: /* Examples: int2str( str2int("test") ) == "test" // true int2str( str2int("t€st") ) // "t¬st", because "€".charCodeAt(0) is 8364, will be AND'ed with 0xff Limitations: maximum 4 characters, so it fits into an integer */ function str2int(the_str) { var ret = 0; var len = the_str.length; if (len >= 1) ret += (the_str.charCodeAt(0) & 0xff) << 0; if (len >= 2) ret += (the_str.charCodeAt(1) & 0xff) << 8; if (len >= 3) ret += (the_str.charCodeAt(2) & 0xff) << 16; if (len >= 4) ret += (the_str.charCodeAt(3) & 0xff) << 24; return ret; } function int2str(the_int) { var tmp = [ (the_int & 0x000000ff) >> 0, (the_int & 0x0000ff00) >> 8, (the_int & 0x00ff0000) >> 16, (the_int & 0xff000000) >> 24 ]; var ret = ""; for (var i=0; i<4; i++) { if (tmp[i] == 0) break; ret += String.fromCharCode(tmp[i]); } return ret; }
String to Number in JavaScript: Unary + (most recommended) +numStr is easy to use and has better performance compared with others Supports both integers and decimals console.log(+'123.45') // => 123.45 Some other options: Parsing Strings: parseInt(numStr) for integers parseFloat(numStr) for both integers and decimals console.log(parseInt('123.456')) // => 123 console.log(parseFloat('123')) // => 123 JavaScript Functions Math functions like round(numStr), floor(numStr), ceil(numStr) for integers Number(numStr) for both integers and decimals console.log(Math.floor('123')) // => 123 console.log(Math.round('123.456')) // => 123 console.log(Math.ceil('123.454')) // => 124 console.log(Number('123.123')) // => 123.123 Unary Operators All basic unary operators, +numStr, numStr-0, 1*numStr, numStr*1, and numStr/1 All support both integers and decimals Be cautious about numStr+0. It returns a string. console.log(+'123') // => 123 console.log('002'-0) // => 2 console.log(1*'5') // => 5 console.log('7.7'*1) // => 7.7 console.log(3.3/1) // =>3.3 console.log('123.123'+0, typeof ('123.123' + 0)) // => 123.1230 string Bitwise Operators Two tilde ~~numStr or left shift 0, numStr<<0 Supports only integers, but not decimals console.log(~~'123') // => 123 console.log('0123'<<0) // => 123 console.log(~~'123.123') // => 123 console.log('123.123'<<0) // => 123 // Parsing console.log(parseInt('123.456')) // => 123 console.log(parseFloat('123')) // => 123 // Function console.log(Math.floor('123')) // => 123 console.log(Math.round('123.456')) // => 123 console.log(Math.ceil('123.454')) // => 124 console.log(Number('123.123')) // => 123.123 // Unary console.log(+'123') // => 123 console.log('002'-0) // => 2 console.log(1*'5') // => 5 console.log('7.7'*1) // => 7.7 console.log(3.3/1) // => 3.3 console.log('123.123'+0, typeof ('123.123'+0)) // => 123.1230 string // Bitwise console.log(~~'123') // => 123 console.log('0123'<<0) // => 123 console.log(~~'123.123') // => 123 console.log('123.123'<<0) // => 123
function parseIntSmarter(str) { // ParseInt is bad because it returns 22 for "22thisendsintext" // Number() is returns NaN if it ends in non-numbers, but it returns 0 for empty or whitespace strings. return isNaN(Number(str)) ? NaN : parseInt(str, 10); }
You can use plus. For example: var personAge = '24'; var personAge1 = (+personAge) then you can see the new variable's type bytypeof personAge1 ; which is number.
Summing the multiplication of digits with their respective power of ten: i.e: 123 = 100+20+3 = 1100 + 2+10 + 31 = 1*(10^2) + 2*(10^1) + 3*(10^0) function atoi(array) { // Use exp as (length - i), other option would be // to reverse the array. // Multiply a[i] * 10^(exp) and sum let sum = 0; for (let i = 0; i < array.length; i++) { let exp = array.length - (i+1); let value = array[i] * Math.pow(10, exp); sum += value; } return sum; }
The safest way to ensure you get a valid integer: let integer = (parseInt(value, 10) || 0); Examples: // Example 1 - Invalid value: let value = null; let integer = (parseInt(value, 10) || 0); // => integer = 0 // Example 2 - Valid value: let value = "1230.42"; let integer = (parseInt(value, 10) || 0); // => integer = 1230 // Example 3 - Invalid value: let value = () => { return 412 }; let integer = (parseInt(value, 10) || 0); // => integer = 0
Another option is to double XOR the value with itself: var i = 12.34; console.log('i = ' + i); console.log('i ⊕ i ⊕ i = ' + (i ^ i ^ i)); This will output: i = 12.34 i ⊕ i ⊕ i = 12
I only added one plus(+) before string and that was solution! +"052254" // 52254
Number() Number(" 200.12 ") // Returns 200.12 Number("200.12") // Returns 200.12 Number("200") // Returns 200 parseInt() parseInt(" 200.12 ") // Return 200 parseInt("200.12") // Return 200 parseInt("200") // Return 200 parseInt("Text information") // Returns NaN parseFloat() It will return the first number parseFloat("200 400") // Returns 200 parseFloat("200") // Returns 200 parseFloat("Text information") // Returns NaN parseFloat("200.10") // Return 200.10 Math.floor() Round a number to the nearest integer Math.floor(" 200.12 ") // Return 200 Math.floor("200.12") // Return 200 Math.floor("200") // Return 200
function doSth(){ var a = document.getElementById('input').value; document.getElementById('number').innerHTML = toNumber(a) + 1; } function toNumber(str){ return +str; } <input id="input" type="text"> <input onclick="doSth()" type="submit"> <span id="number"></span>
This (probably) isn't the best solution for parsing an integer, but if you need to "extract" one, for example: "1a2b3c" === 123 "198some text2hello world!30" === 198230 // ... this would work (only for integers): var str = '3a9b0c3d2e9f8g' function extractInteger(str) { var result = 0; var factor = 1 for (var i = str.length; i > 0; i--) { if (!isNaN(str[i - 1])) { result += parseInt(str[i - 1]) * factor factor *= 10 } } return result } console.log(extractInteger(str)) Of course, this would also work for parsing an integer, but would be slower than other methods. You could also parse integers with this method and return NaN if the string isn't a number, but I don't see why you'd want to since this relies on parseInt internally and parseInt is probably faster. var str = '3a9b0c3d2e9f8g' function extractInteger(str) { var result = 0; var factor = 1 for (var i = str.length; i > 0; i--) { if (isNaN(str[i - 1])) return NaN result += parseInt(str[i - 1]) * factor factor *= 10 } return result } console.log(extractInteger(str))
How to shorten UUID V4 without making it non-unique/guessable
I have to generate unique URL part which will be "unguessable" and "resistant" to brute force attack. It also has to be as short as possible :) and all generated values has to be of same length. I was thinking about using UUID V4 which can be represented by 32 (without hyphens) hex chars de305d5475b4431badb2eb6b9e546014 but it's a bit too long. So my question is how to generate something unqiue, that can be represented with url charcters with same length for each generated value and shorter than 32 chars. (In node.js or pgpsql)
v4() will generate a large number which is translated into a hexadecimal string. In Node.js you can use Buffer to convert the string into a smaller base64 encoding: import { v4 } from 'uuid'; function getRandomName() { let hexString = v4(); console.log("hex: ", hexString); // remove decoration hexString = hexString.replace(/-/g, ""); let base64String = Buffer.from(hexString, 'hex').toString('base64') console.log("base64:", base64String); return base64String; } Which produces: hex: 6fa1ca99-a92b-4d2a-aac2-7c7977119ebc base64: b6HKmakr hex: bd23c8fd-0f62-49f4-9e51-8b5c97601a16 base64: vSPI/Q9i
UUID v4 itself does not actually guarantee uniqueness. It's just very, very unlikely that two randomly generated UUIDs will clash. That's why they need to be so long - that reduces the clashing chance. So you can make it shorter, but the shorter you make it, the more likely that it won't actually be unique. UUID v4 is 128 bit long because that is commonly considered "unique enough".
The short-uuid module does just that. "Generate and translate standard UUIDs into shorter - or just different - formats and back." It accepts custom character sets (and offers a few) to translate the UUID to and fro. You can also base64 the uuid which shortens it a bit to 22. Here's a playground.
It all depends on how guessable/unique it has to be. My suggestion would be to generate 128 random bits and then encode it using base36. That would give you a "nice" URL and it would be unique and probably unguessable enough. If you want it even shorter you can use base64, but base64 needs to contain two non alphanumeric characters.
This is a fairly old thread, but I'd like to point out the top answer does not produce the results it claims. It will actually produce strings that are ~32 characters long, but the examples claim 8 characters. If you want more compression convert the uuid to base 90 using this function. Using Base64 takes 4 characters for every 3 bytes, and Hex (Base16) takes 2 characters for each byte. This means that Base64 will have ~67% better storage size than hex, but if we can increase that character/byte ratio we can get even better compression. Base90 gives ever so slightly more compression because of this. const hex = "0123456789abcdef"; const base90 = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!#$%&'()*+-./:<=>?#[]^_`{|}~"; /** * Convers a Base16 (Hex) represented string to a Base 90 String. * #param {String} number Hex represented string * #returns A Base90 representation of the hex string */ function convertToBase90(number) { var i, divide, newlen, numberMap = {}, fromBase = hex.length, toBase = base90.length, length = number.length, result = typeof number === "string" ? "" : []; for (i = 0; i < length; i++) { numberMap[i] = hex.indexOf(number[i]); } do { divide = 0; newlen = 0; for (i = 0; i < length; i++) { divide = divide * fromBase + numberMap[i]; if (divide >= toBase) { numberMap[newlen++] = parseInt(divide / toBase, 10); divide = divide % toBase; } else if (newlen > 0) { numberMap[newlen++] = 0; } } length = newlen; result = base90.slice(divide, divide + 1).concat(result); } while (newlen !== 0); return result; } /** * Compresses a UUID String to base 90 resulting in a shorter UUID String * #param {String} uuid The UUID string to compress * #returns A compressed UUID String. */ function compressUUID(uuid) { uuid = uuid.replace(/-/g, ""); return convertToBase90(uuid); } Over a few million random uuids this generates no duplicates and the following output: Lengths: Avg: 19.959995 Max: 20 Min: 17 Examples: Hex: 68f75ee7-deb6-4c5c-b315-3cc6bd7ca0fd Base 90: atP!.AcGJh1(eW]1LfAh Hex: 91fb8316-f033-40d1-974d-20751b831c4e Base 90: ew-}Kv&nK?y#~xip5/0e Hex: 4cb167ee-eb4b-4a76-90f2-6ced439d5ca5 Base 90: 7Ng]V/:0$PeS-K?!uTed
UUID is 36 characters long and you can shorten it to 22 characters (~30%) if you want save ability to convert it back and for it to be url safe. Here is pure node solution for base64 url safe string: type UUID = string; type Base64UUID = string; /** * Convert uuid to base64url * * #example in: `f32a91da-c799-4e13-aa17-8c4d9e0323c9` out: `8yqR2seZThOqF4xNngMjyQ` */ export function uuidToBase64(uuid: UUID): Base64UUID { return Buffer.from(uuid.replace(/-/g, ''), 'hex').toString('base64url'); } /** * Convert base64url to uuid * * #example in: `8yqR2seZThOqF4xNngMjyQ` out: `f32a91da-c799-4e13-aa17-8c4d9e0323c9` */ export function base64toUUID(base64: Base64UUID): UUID { const hex = Buffer.from(base64, 'base64url').toString('hex'); return `${hex.substring(0, 8)}-${hex.substring(8, 12)}-${hex.substring( 12, 16, )}-${hex.substring(16, 20)}-${hex.substring(20)}`; } Test: import { randomUUID } from "crypto"; // f32a91da-c799-4e13-aa17-8c4d9e0323c9 const uuid = randomUUID(); // 8yqR2seZThOqF4xNngMjyQ const base64 = uuidToBase64(uuid); // f32a91da-c799-4e13-aa17-8c4d9e0323c9 const uuidFromBase64 = base64toUUID(base64);
CRijndael only encrpyting first 32 bytes of longer string
I'm using CRijndael ( http://www.codeproject.com/Articles/1380/A-C-Implementation-of-the-Rijndael-Encryption-Decr ) for encryption using a null based iv (I know that's an issue but for certain reasons I'm stuck with having to use that). For strings that are longer (or contain a few ampersands) I'm only ever getting the first 32 bytes encrypted. Shorter strings are encrypted without any issues. Code is below, any ideas? char dataIn[] = "LONG STRING HERE"; string preInput = dataIn; CRijndael aRijndael; aRijndael.MakeKey("32-BIT-KEY-HERE", CRijndael::sm_chain0, 32, 16); while (preInput.length() % 16 != 0) { preInput += '\0'; } const char *encInput = preInput.c_str(); char szReq[1000]; aRijndael.Encrypt(preInput.c_str(), szReq, preInput.size(), CRijndael::CBC); const std::string preBase64 = szReq; std::string encoded = base64_encode(reinterpret_cast<const unsigned char*>(preBase64.c_str()), preBase64.length());