diff --git a/build_tools/travis/install.sh b/build_tools/travis/install.sh
index 41ded4627..cb52b4aaf 100755
--- a/build_tools/travis/install.sh
+++ b/build_tools/travis/install.sh
@@ -100,7 +100,8 @@ elif [[ "$DISTRIB" == "pypy" ]]; then
     # install pip
     python -m ensurepip --upgrade
     if [[ "$NUMPY" == "true" ]]; then
-        python -m pip install cython numpy
+        # see #794 - avoid PyPy bug with newer NumPy versions
+        python -m pip install cython numpy==1.15.4
     fi
     python -m pip install nose nose-timer pytest pytest-cov codecov setuptools
 fi
diff --git a/pydicom/values.py b/pydicom/values.py
index 6a1706796..f55938c85 100644
--- a/pydicom/values.py
+++ b/pydicom/values.py
@@ -310,7 +310,12 @@ def convert_UR_string(byte_string, is_little_endian, struct_format=None):
 def convert_value(VR, raw_data_element, encodings=None):
     """Return the converted value (from raw bytes) for the given VR"""
     if VR not in converters:
-        message = "Unknown Value Representation '{0}'".format(VR)
+        # `VR` characters are in the ascii alphabet ranges 65 - 90, 97 - 122
+        char_range = list(range(65, 91)) + list(range(97, 123))
+        # If the VR characters are outside that range then print hex values
+        if ord(VR[0]) not in char_range or ord(VR[1]) not in char_range:
+            VR = ' '.join(['0x{:02x}'.format(ord(ch)) for ch in VR])
+        message = "Unknown Value Representation '{}'".format(VR)
         raise NotImplementedError(message)
 
     # Look up the function to convert that VR

Print byte values for unknown VR during read
#### Description
If the dataset read fails due to an unknown VR then the exception message prints the VR bytes in a format that isn't useful for debugging.

#### Steps/Code to Reproduce
```python
from io import BytesIO
from pydicom.filereader import read_dataset
ds = read_dataset(BytesIO(b'\x08\x00\x01\x00\x04\x00\x00\x00\x00\x08\x00\x49'), False, True)
print(ds)
```

#### Expected Results
```
NotImplementedError: Unknown Value Representation: '32 31' in tag (0000, 0002)
```
#### Actual Results
```
File "<stdin>", line 1, in <module>
  File ".../pydicom/pydicom/dataset.py", line 1284, in __str__
    return self._pretty_str()
  File ".../pydicom/pydicom/dataset.py", line 1022, in _pretty_str
    for data_element in self:
  File ".../pydicom/pydicom/dataset.py", line 751, in __iter__
    yield self[tag]
  File ".../pydicom/pydicom/dataset.py", line 637, in __getitem__
    self[tag] = DataElement_from_raw(data_elem, character_set)
  File ".../pydicom/pydicom/dataelem.py", line 447, in DataElement_from_raw
    raise NotImplementedError("{0:s} in tag {1!r}".format(str(e), raw.tag))
NotImplementedError: Unknown Value Representation '' in tag (0008, 0001)
```
[Or see here for another example](https://user-images.githubusercontent.com/28559755/51027486-4abf4100-1591-11e9-8f44-a739b00ca300.PNG)


diff --git a/pydicom/tests/test_filereader.py b/pydicom/tests/test_filereader.py
index 0ded943d8..5cce75cc2 100644
--- a/pydicom/tests/test_filereader.py
+++ b/pydicom/tests/test_filereader.py
@@ -15,7 +15,7 @@ import pytest
 import pydicom.config
 from pydicom.dataset import Dataset, FileDataset
 from pydicom.data import get_testdata_files
-from pydicom.filereader import dcmread
+from pydicom.filereader import dcmread, read_dataset
 from pydicom.dataelem import DataElement, DataElement_from_raw
 from pydicom.errors import InvalidDicomError
 from pydicom.filebase import DicomBytesIO
@@ -689,6 +689,67 @@ class ReaderTests(unittest.TestCase):
             self.fail('Unexpected EOFError raised')
 
 
+class TestUnknownVR(object):
+    @pytest.mark.parametrize(
+        'vr_bytes, str_output',
+        [
+            # Test limits of char values
+            (b'\x00\x41', '0x00 0x41'),  # 000/A
+            (b'\x40\x41', '0x40 0x41'),  # 064/A
+            (b'\x5B\x41', '0x5b 0x41'),  # 091/A
+            (b'\x60\x41', '0x60 0x41'),  # 096/A
+            (b'\x7B\x41', '0x7b 0x41'),  # 123/A
+            (b'\xFF\x41', '0xff 0x41'),  # 255/A
+            # Test good/bad
+            (b'\x41\x00', '0x41 0x00'),  # A/-
+            (b'\x5A\x00', '0x5a 0x00'),  # Z/-
+            # Test not quite good/bad
+            (b'\x61\x00', '0x61 0x00'),  # a/-
+            (b'\x7A\x00', '0x7a 0x00'),  # z/-
+            # Test bad/good
+            (b'\x00\x41', '0x00 0x41'),  # -/A
+            (b'\x00\x5A', '0x00 0x5a'),  # -/Z
+            # Test bad/not quite good
+            (b'\x00\x61', '0x00 0x61'),  # -/a
+            (b'\x00\x7A', '0x00 0x7a'),  # -/z
+            # Test good/good
+            (b'\x41\x41', 'AA'),  # A/A
+            (b'\x41\x5A', 'AZ'),  # A/Z
+            (b'\x5A\x41', 'ZA'),  # Z/A
+            (b'\x5A\x5A', 'ZZ'),  # Z/Z
+            # Test not quite good
+            (b'\x41\x61', 'Aa'),  # A/a
+            (b'\x41\x7A', 'Az'),  # A/z
+            (b'\x61\x41', 'aA'),  # a/A
+            (b'\x61\x5A', 'aZ'),  # a/Z
+            (b'\x61\x61', 'aa'),  # a/a
+            (b'\x61\x7A', 'az'),  # a/z
+            (b'\x5A\x61', 'Za'),  # Z/a
+            (b'\x5A\x7A', 'Zz'),  # Z/z
+            (b'\x7A\x41', 'zA'),  # z/A
+            (b'\x7A\x5A', 'zZ'),  # z/Z
+            (b'\x7A\x61', 'za'),  # z/a
+            (b'\x7A\x7A', 'zz'),  # z/z
+        ]
+    )
+    def test_fail_decode_msg(self, vr_bytes, str_output):
+        """Regression test for #791."""
+        ds = read_dataset(
+            BytesIO(
+                b'\x08\x00\x01\x00' +
+                vr_bytes +
+                b'\x00\x00\x00\x08\x00\x49'
+            ),
+            False, True
+        )
+        msg = (
+            r"Unknown Value Representation '{}' in tag \(0008, 0001\)"
+            .format(str_output)
+        )
+        with pytest.raises(NotImplementedError, match=msg):
+            print(ds)
+
+
 class ReadDataElementTests(unittest.TestCase):
     def setUp(self):
         ds = Dataset()

pip install -e .
parse_log_pytest
pytest
pytest
apt-get update apt-get install -y gcc
3.6
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs @ file:///opt/conda/conda-bld/attrs_1642510447205/work
certifi==2021.5.30
importlib-metadata @ file:///tmp/build/80754af9/importlib-metadata_1631916693255/work
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
more-itertools @ file:///tmp/build/80754af9/more-itertools_1637733554872/work
packaging @ file:///tmp/build/80754af9/packaging_1637314298585/work
pluggy @ file:///tmp/build/80754af9/pluggy_1615976315926/work
py @ file:///opt/conda/conda-bld/py_1644396412707/work
-e git+https://github.com/pydicom/pydicom.git@897fe092ae3ef282a21c894b47134233bdd5cdd0#egg=pydicom
pyparsing @ file:///tmp/build/80754af9/pyparsing_1635766073266/work
pytest==6.2.4
toml @ file:///tmp/build/80754af9/toml_1616166611790/work
typing_extensions @ file:///opt/conda/conda-bld/typing_extensions_1647553014482/work
zipp @ file:///tmp/build/80754af9/zipp_1633618647012/work

name: pydicom
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - attrs=21.4.0=pyhd3eb1b0_0
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - importlib-metadata=4.8.1=py36h06a4308_0
  - importlib_metadata=4.8.1=hd3eb1b0_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - more-itertools=8.12.0=pyhd3eb1b0_0
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - packaging=21.3=pyhd3eb1b0_0
  - pip=21.2.2=py36h06a4308_0
  - pluggy=0.13.1=py36h06a4308_0
  - py=1.11.0=pyhd3eb1b0_0
  - pyparsing=3.0.4=pyhd3eb1b0_0
  - pytest=6.2.4=py36h06a4308_2
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - toml=0.10.2=pyhd3eb1b0_0
  - typing_extensions=4.1.1=pyh06a4308_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zipp=3.6.0=pyhd3eb1b0_0
  - zlib=1.2.13=h5eee18b_1
prefix: /opt/conda/envs/pydicom

pydicom/tests/test_filereader.py::TestUnknownVR::test_fail_decode_msg[\x00A-0x00 pydicom/tests/test_filereader.py::TestUnknownVR::test_fail_decode_msg[@A-0x40 pydicom/tests/test_filereader.py::TestUnknownVR::test_fail_decode_msg[[A-0x5b pydicom/tests/test_filereader.py::TestUnknownVR::test_fail_decode_msg[`A-0x60 pydicom/tests/test_filereader.py::TestUnknownVR::test_fail_decode_msg[{A-0x7b pydicom/tests/test_filereader.py::TestUnknownVR::test_fail_decode_msg[\xffA-0xff pydicom/tests/test_filereader.py::TestUnknownVR::test_fail_decode_msg[A\x00-0x41 pydicom/tests/test_filereader.py::TestUnknownVR::test_fail_decode_msg[Z\x00-0x5a pydicom/tests/test_filereader.py::TestUnknownVR::test_fail_decode_msg[a\x00-0x61 pydicom/tests/test_filereader.py::TestUnknownVR::test_fail_decode_msg[z\x00-0x7a pydicom/tests/test_filereader.py::TestUnknownVR::test_fail_decode_msg[\x00Z-0x00 pydicom/tests/test_filereader.py::TestUnknownVR::test_fail_decode_msg[\x00a-0x00 pydicom/tests/test_filereader.py::TestUnknownVR::test_fail_decode_msg[\x00z-0x00
pydicom/tests/test_filereader.py::ReaderTests::testCT pydicom/tests/test_filereader.py::ReaderTests::testDeflate pydicom/tests/test_filereader.py::ReaderTests::testDir pydicom/tests/test_filereader.py::ReaderTests::testEmptyNumbersTag pydicom/tests/test_filereader.py::ReaderTests::testExplicitVRBigEndianNoMeta pydicom/tests/test_filereader.py::ReaderTests::testExplicitVRLittleEndianNoMeta pydicom/tests/test_filereader.py::ReaderTests::testMR pydicom/tests/test_filereader.py::ReaderTests::testNestedPrivateSQ pydicom/tests/test_filereader.py::ReaderTests::testNoForce pydicom/tests/test_filereader.py::ReaderTests::testNoMetaGroupLength pydicom/tests/test_filereader.py::ReaderTests::testNoPixelsRead pydicom/tests/test_filereader.py::ReaderTests::testNoTransferSyntaxInMeta pydicom/tests/test_filereader.py::ReaderTests::testPlanarConfig pydicom/tests/test_filereader.py::ReaderTests::testPrivateSQ pydicom/tests/test_filereader.py::ReaderTests::testRTDose pydicom/tests/test_filereader.py::ReaderTests::testRTPlan pydicom/tests/test_filereader.py::ReaderTests::testRTstruct pydicom/tests/test_filereader.py::ReaderTests::testSpecificTags pydicom/tests/test_filereader.py::ReaderTests::testSpecificTagsWithUnknownLengthSQ pydicom/tests/test_filereader.py::ReaderTests::testSpecificTagsWithUnknownLengthTag pydicom/tests/test_filereader.py::ReaderTests::testUTF8FileName pydicom/tests/test_filereader.py::ReaderTests::test_commandset_no_dataset pydicom/tests/test_filereader.py::ReaderTests::test_correct_ambiguous_explicit_vr pydicom/tests/test_filereader.py::ReaderTests::test_correct_ambiguous_vr pydicom/tests/test_filereader.py::ReaderTests::test_correct_ambiguous_vr_compressed pydicom/tests/test_filereader.py::ReaderTests::test_dcmread_does_not_raise pydicom/tests/test_filereader.py::ReaderTests::test_file_meta_dataset_implicit_vr pydicom/tests/test_filereader.py::ReaderTests::test_group_length_wrong pydicom/tests/test_filereader.py::ReaderTests::test_long_specific_char_set pydicom/tests/test_filereader.py::ReaderTests::test_meta_no_dataset pydicom/tests/test_filereader.py::ReaderTests::test_no_dataset pydicom/tests/test_filereader.py::ReaderTests::test_no_preamble_command_group_dataset pydicom/tests/test_filereader.py::ReaderTests::test_no_preamble_file_meta_dataset pydicom/tests/test_filereader.py::ReaderTests::test_preamble_command_meta_no_dataset pydicom/tests/test_filereader.py::ReaderTests::test_preamble_commandset_no_dataset pydicom/tests/test_filereader.py::ReaderTests::test_preamble_meta_no_dataset pydicom/tests/test_filereader.py::TestUnknownVR::test_fail_decode_msg[AA-AA] pydicom/tests/test_filereader.py::TestUnknownVR::test_fail_decode_msg[AZ-AZ] pydicom/tests/test_filereader.py::TestUnknownVR::test_fail_decode_msg[ZA-ZA] pydicom/tests/test_filereader.py::TestUnknownVR::test_fail_decode_msg[ZZ-ZZ] pydicom/tests/test_filereader.py::TestUnknownVR::test_fail_decode_msg[Aa-Aa] pydicom/tests/test_filereader.py::TestUnknownVR::test_fail_decode_msg[Az-Az] pydicom/tests/test_filereader.py::TestUnknownVR::test_fail_decode_msg[aA-aA] pydicom/tests/test_filereader.py::TestUnknownVR::test_fail_decode_msg[aZ-aZ] pydicom/tests/test_filereader.py::TestUnknownVR::test_fail_decode_msg[aa-aa] pydicom/tests/test_filereader.py::TestUnknownVR::test_fail_decode_msg[az-az] pydicom/tests/test_filereader.py::TestUnknownVR::test_fail_decode_msg[Za-Za] pydicom/tests/test_filereader.py::TestUnknownVR::test_fail_decode_msg[Zz-Zz] pydicom/tests/test_filereader.py::TestUnknownVR::test_fail_decode_msg[zA-zA] pydicom/tests/test_filereader.py::TestUnknownVR::test_fail_decode_msg[zZ-zZ] pydicom/tests/test_filereader.py::TestUnknownVR::test_fail_decode_msg[za-za] pydicom/tests/test_filereader.py::TestUnknownVR::test_fail_decode_msg[zz-zz] pydicom/tests/test_filereader.py::ReadDataElementTests::test_read_AE pydicom/tests/test_filereader.py::ReadDataElementTests::test_read_OD_explicit_little pydicom/tests/test_filereader.py::ReadDataElementTests::test_read_OD_implicit_little pydicom/tests/test_filereader.py::ReadDataElementTests::test_read_OL_explicit_little pydicom/tests/test_filereader.py::ReadDataElementTests::test_read_OL_implicit_little pydicom/tests/test_filereader.py::ReadDataElementTests::test_read_UC_explicit_little pydicom/tests/test_filereader.py::ReadDataElementTests::test_read_UC_implicit_little pydicom/tests/test_filereader.py::ReadDataElementTests::test_read_UR_explicit_little pydicom/tests/test_filereader.py::ReadDataElementTests::test_read_UR_implicit_little pydicom/tests/test_filereader.py::DeferredReadTests::testFileExists pydicom/tests/test_filereader.py::DeferredReadTests::testTimeCheck pydicom/tests/test_filereader.py::DeferredReadTests::testValuesIdentical pydicom/tests/test_filereader.py::DeferredReadTests::testZippedDeferred pydicom/tests/test_filereader.py::ReadTruncatedFileTests::testReadFileWithMissingPixelData pydicom/tests/test_filereader.py::FileLikeTests::testReadFileGivenFileLikeObject pydicom/tests/test_filereader.py::FileLikeTests::testReadFileGivenFileObject pydicom/tests/test_filereader.py::TestDataElementGenerator::test_little_endian_explicit pydicom/tests/test_filereader.py::TestDataElementGenerator::test_little_endian_implicit pydicom/tests/test_filereader.py::TestDataElementGenerator::test_big_endian_explicit
pydicom/values.py build_tools/travis/install.sh
pydicom/values.py build_tools/travis/install.sh