Kaydet (Commit) dd1da7f7 authored tarafından Serhiy Storchaka's avatar Serhiy Storchaka

Issue #28927: bytes.fromhex() and bytearray.fromhex() now ignore all ASCII

whitespace, not only spaces.  Patch by Robert Xiao.
üst f76df278
...@@ -2314,11 +2314,15 @@ the bytes type has an additional class method to read data in that format: ...@@ -2314,11 +2314,15 @@ the bytes type has an additional class method to read data in that format:
This :class:`bytes` class method returns a bytes object, decoding the This :class:`bytes` class method returns a bytes object, decoding the
given string object. The string must contain two hexadecimal digits per given string object. The string must contain two hexadecimal digits per
byte, with ASCII spaces being ignored. byte, with ASCII whitespace being ignored.
>>> bytes.fromhex('2Ef0 F1f2 ') >>> bytes.fromhex('2Ef0 F1f2 ')
b'.\xf0\xf1\xf2' b'.\xf0\xf1\xf2'
.. versionchanged:: 3.7
:meth:`bytes.fromhex` now skips all ASCII whitespace in the string,
not just spaces.
A reverse conversion function exists to transform a bytes object into its A reverse conversion function exists to transform a bytes object into its
hexadecimal representation. hexadecimal representation.
...@@ -2382,11 +2386,15 @@ the bytearray type has an additional class method to read data in that format: ...@@ -2382,11 +2386,15 @@ the bytearray type has an additional class method to read data in that format:
This :class:`bytearray` class method returns bytearray object, decoding This :class:`bytearray` class method returns bytearray object, decoding
the given string object. The string must contain two hexadecimal digits the given string object. The string must contain two hexadecimal digits
per byte, with ASCII spaces being ignored. per byte, with ASCII whitespace being ignored.
>>> bytearray.fromhex('2Ef0 F1f2 ') >>> bytearray.fromhex('2Ef0 F1f2 ')
bytearray(b'.\xf0\xf1\xf2') bytearray(b'.\xf0\xf1\xf2')
.. versionchanged:: 3.7
:meth:`bytearray.fromhex` now skips all ASCII whitespace in the string,
not just spaces.
A reverse conversion function exists to transform a bytearray object into its A reverse conversion function exists to transform a bytearray object into its
hexadecimal representation. hexadecimal representation.
......
...@@ -79,6 +79,10 @@ Other Language Changes ...@@ -79,6 +79,10 @@ Other Language Changes
now have more than 255 parameters. now have more than 255 parameters.
(Contributed by Serhiy Storchaka in :issue:`12844` and :issue:`18896`.) (Contributed by Serhiy Storchaka in :issue:`12844` and :issue:`18896`.)
* :meth:`bytes.fromhex` and :meth:`bytearray.fromhex` now ignore all ASCII
whitespace, not only spaces.
(Contributed by Robert Xiao in :issue:`28927`.)
New Modules New Modules
=========== ===========
......
...@@ -293,6 +293,14 @@ class BaseBytesTest: ...@@ -293,6 +293,14 @@ class BaseBytesTest:
b = bytearray([0x1a, 0x2b, 0x30]) b = bytearray([0x1a, 0x2b, 0x30])
self.assertEqual(self.type2test.fromhex('1a2B30'), b) self.assertEqual(self.type2test.fromhex('1a2B30'), b)
self.assertEqual(self.type2test.fromhex(' 1A 2B 30 '), b) self.assertEqual(self.type2test.fromhex(' 1A 2B 30 '), b)
# check that ASCII whitespace is ignored
self.assertEqual(self.type2test.fromhex(' 1A\n2B\t30\v'), b)
for c in "\x09\x0A\x0B\x0C\x0D\x20":
self.assertEqual(self.type2test.fromhex(c), self.type2test())
for c in "\x1C\x1D\x1E\x1F\x85\xa0\u2000\u2002\u2028":
self.assertRaises(ValueError, self.type2test.fromhex, c)
self.assertEqual(self.type2test.fromhex('0000'), b'\0\0') self.assertEqual(self.type2test.fromhex('0000'), b'\0\0')
self.assertRaises(TypeError, self.type2test.fromhex, b'1B') self.assertRaises(TypeError, self.type2test.fromhex, b'1B')
self.assertRaises(ValueError, self.type2test.fromhex, 'a') self.assertRaises(ValueError, self.type2test.fromhex, 'a')
......
...@@ -10,6 +10,9 @@ What's New in Python 3.7.0 alpha 1 ...@@ -10,6 +10,9 @@ What's New in Python 3.7.0 alpha 1
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #28927: bytes.fromhex() and bytearray.fromhex() now ignore all ASCII
whitespace, not only spaces. Patch by Robert Xiao.
- Issue #25677: Correct the positioning of the syntax error caret for - Issue #25677: Correct the positioning of the syntax error caret for
indented blocks. Based on patch by Michael Layzell. indented blocks. Based on patch by Michael Layzell.
......
...@@ -2378,10 +2378,10 @@ _PyBytes_FromHex(PyObject *string, int use_bytearray) ...@@ -2378,10 +2378,10 @@ _PyBytes_FromHex(PyObject *string, int use_bytearray)
end = str + hexlen; end = str + hexlen;
while (str < end) { while (str < end) {
/* skip over spaces in the input */ /* skip over spaces in the input */
if (*str == ' ') { if (Py_ISSPACE(*str)) {
do { do {
str++; str++;
} while (*str == ' '); } while (Py_ISSPACE(*str));
if (str >= end) if (str >= end)
break; break;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment