[
https://issues.apache.org/jira/browse/MAPREDUCE-7333?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17313260#comment-17313260
]
Peter Bacsko commented on MAPREDUCE-7333:
-----------------------------------------
[~Marcono1234] this is certainly an interesting observation.
What about this implementation? Maybe a bit too contrived, but only uses array
lookups:
{noformat}
public static String toHex(byte[] ba) {
String[] hexChars = new String[] {
"0", "1", "2", "3",
"4", "5", "6", "7",
"8", "9", "a", "b",
"c", "d", "e", "f",
};
StringBuilder sb = new StringBuilder(ba.length * 2);
for (byte b : ba) {
int high = (b & 0xf0) >> 4;
int low = b & 0x0f;
sb.append(hexChars[high]);
sb.append(hexChars[low]);
}
return sb.toString();
}
{noformat}
> SecureShuffleUtils.toHex(byte[]) creates malformed hex string
> -------------------------------------------------------------
>
> Key: MAPREDUCE-7333
> URL: https://issues.apache.org/jira/browse/MAPREDUCE-7333
> Project: Hadoop Map/Reduce
> Issue Type: Bug
> Affects Versions: 3.2.2
> Reporter: Marcono1234
> Priority: Major
>
> {{org.apache.hadoop.mapreduce.security.SecureShuffleUtils.toHex(byte[])}}
> creates malformed hex strings:
> {code}
> for (byte b : ba) {
> ps.printf("%x", b);
> }
> {code}
> The pattern {{"%x"}} would for bytes < 16 only have on hex char and for
> example both {{1, 0}} and {{16}} would have the result {{"10"}}.
> A correct (and more efficient) implementation would be:
> {code}
> public static String toHex(byte[] ba) {
> StringBuilder sb = new StringBuilder(ba.length * 2);
> for (byte b : ba) {
> int unsignedB = b & 0xFF;
> if (unsignedB < 16) {
> sb.append('0');
> }
> sb.append(Integer.toHexString(unsignedB));
> }
> return sb.toString();
> }
> {code}
--
This message was sent by Atlassian Jira
(v8.3.4#803005)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]