Index: hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestBytes.java =================================================================== --- hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestBytes.java (revision 1397200) +++ hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestBytes.java (working copy) @@ -302,5 +302,10 @@ fail("Illegal string access: " + ex.getMessage()); } } + + public void testToStringBinary_toBytesBinary_Reversable() throws Exception { + String bytes = Bytes.toStringBinary(Bytes.toBytes(2.17)); + assertEquals(2.17, Bytes.toDouble(Bytes.toBytesBinary(bytes)), 0); + } } Index: hbase-common/src/main/java/org/apache/hadoop/hbase/util/Bytes.java =================================================================== --- hbase-common/src/main/java/org/apache/hadoop/hbase/util/Bytes.java (revision 1397200) +++ hbase-common/src/main/java/org/apache/hadoop/hbase/util/Bytes.java (working copy) @@ -387,7 +387,14 @@ int size = 0; for (int i = 0; i < in.length(); ++i) { char ch = in.charAt(i); - if (ch == '\\' && in.length() > i+1 && in.charAt(i+1) == 'x') { + if (ch == '\\') { + // begin hex escape: + char next = i+1 < in.length() ? in.charAt(i+1) : ch; // check for array out of bounds + if (next != 'x') { + // invalid escape sequence, ignore this one. + b[size++] = (byte)ch; + continue; + } // ok, take next 2 hex digits. char hd1 = in.charAt(i+2); char hd2 = in.charAt(i+3);