This Javascript MD5 implementation has me confused.
In the global space, the author declares a var:
var hexcase = 0;
Later on, the following method appears:
function rstr2hex(input)
{
try { hexcase } catch(e) { hexcase=0; }
var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
var output = "";
var x;
for(var i = 0; i < input.length; i++)
{
x = input.charCodeAt(i);
output += hex_tab.charAt((x >>> 4) & 0x0F)
+ hex_tab.charAt( x & 0x0F);
}
return output;
}
The line that I don't understand is:
try { hexcase } catch(e) { hexcase=0; }
What is the author trying to acplish here?
This Javascript MD5 implementation has me confused.
In the global space, the author declares a var:
var hexcase = 0;
Later on, the following method appears:
function rstr2hex(input)
{
try { hexcase } catch(e) { hexcase=0; }
var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
var output = "";
var x;
for(var i = 0; i < input.length; i++)
{
x = input.charCodeAt(i);
output += hex_tab.charAt((x >>> 4) & 0x0F)
+ hex_tab.charAt( x & 0x0F);
}
return output;
}
The line that I don't understand is:
try { hexcase } catch(e) { hexcase=0; }
What is the author trying to acplish here?
Share Improve this question asked Nov 30, 2011 at 16:07 SteveSteve 31.7k19 gold badges100 silver badges123 bronze badges 1- +1 for mentioning my favourite JS crypto site :) – Polynomial Commented Nov 30, 2011 at 16:12
5 Answers
Reset to default 8He is just making sure hexcase
is defined, and if it isn't, he is defining it.
Try putting
try {amIdefined} catch(e) {console.log('was not defined');}
in your console and you'll see...
Note that this is the safest way of making sure the variable is defined. In order to do
hexcase = hexcase || 0;
you need to do var hexcase
first, or else you will get an error.
If hexcase
does not exist, a ReferenceError
is thrown, and the catch
block is executed. If it does exist, the catch
block is not executed.
So it sets hexcase
to 0
if it does not exist.
It is a creative way of doing this, though. The more usual way is:
hexcase = window.hexcase || 0; // you have to add window because
// otherwise you would still get the error
Looks like hexcase
is a global variable that the author is trying to check the existence of. Not sure that's the best way to do it though :-)
I'd go for:
if (typeof hexcase === "undefined") {
hexcase = 0;
}
Just to make it explicit. You could use this too:
hexcase = hexcase || 0;
he's just checking to see if hexcase was defined, and if not sets a default.
apparantely that will decide whether the result is all uppercase or not...
That try-catch
statement will set hexcase to 0 if it's undefined.