OmegaK2/PyPoE

struct.error: unpack requires a buffer of 8 bytes

Dragony opened this issue · 5 comments

Hello there! Thanks for investing so much time into such a usefull tool :-)

Today I tried to extract data via the CLI:

python3 .\PyPoE\cli\exporter\core.py dat json content.json --files Mods.dat

That seems to work for a while until:

C:\Users\drago\AppData\Local\Temp\tmpe4h6a1cv\chunk38.in:    23496 =>   262144 (0.00 seconds, 311.48 MB/s)
C:\Users\drago\AppData\Local\Temp\tmpe4h6a1cv\chunk39.in:    23672 =>   262144 (0.00 seconds, 303.55 MB/s)
C:\Users\drago\AppData\Local\Temp\tmpe4h6a1cv\chunk40.in:    14561 =>   147600 (0.00 seconds, 259.27 MB/s)
  0%|                                                                                                                                                                                                                   | 0/1 [00:09<?, ?it/s]
23:43:09 Traceback (most recent call last):
  File "C:\Users\drago\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\pypoe-1.0.0a0-py3.9.egg\PyPoE\cli\core.py", line 145, in run
    code = args.func(args)
  File "C:\Users\drago\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\pypoe-1.0.0a0-py3.9.egg\PyPoE\cli\exporter\dat\parsers\json.py", line 109, in handle
    dat_files = self._read_dat_files(args)
  File "C:\Users\drago\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\pypoe-1.0.0a0-py3.9.egg\PyPoE\cli\exporter\dat\handler.py", line 135, in _read_dat_files
    df.read(file_path_or_raw=data, use_dat_value=False)
  File "C:\Users\drago\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\pypoe-1.0.0a0-py3.9.egg\PyPoE\poe\file\shared\__init__.py", line 214, in read
    return self.get_read_buffer(file_path_or_raw, self._read, *args, **kwargs)
  File "C:\Users\drago\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\pypoe-1.0.0a0-py3.9.egg\PyPoE\poe\file\shared\__init__.py", line 172, in get_read_buffer
    return function(*args, buffer=BytesIO(file_path_or_raw), **kwargs)
  File "C:\Users\drago\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\pypoe-1.0.0a0-py3.9.egg\PyPoE\poe\file\dat.py", line 946, in _read
    self.reader.read(buffer.read())
  File "C:\Users\drago\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\pypoe-1.0.0a0-py3.9.egg\PyPoE\poe\file\dat.py", line 849, in read
    self.table_data.append(self._process_row(i))
  File "C:\Users\drago\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\pypoe-1.0.0a0-py3.9.egg\PyPoE\poe\file\dat.py", line 792, in _process_row
    row_data.append(self._cast_from_spec(spec, casts, data=cell_data, offset=offset))
  File "C:\Users\drago\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\pypoe-1.0.0a0-py3.9.egg\PyPoE\poe\file\dat.py", line 763, in _cast_from_spec
    value.append(self._cast_from_spec(specification, casts[1:], value, data_offset+i*casts[1:][0][1]))
  File "C:\Users\drago\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\pypoe-1.0.0a0-py3.9.egg\PyPoE\poe\file\dat.py", line 713, in _cast_from_spec
    ivalue = data[0] if data else struct.unpack('<' + casts[0][2], self._file_raw[offset:offset+casts[0][1]])[0]
struct.error: unpack requires a buffer of 8 bytes

Any idea why this is happening?

This error can sometimes occur when the spec does not match what is present in the actual dat file you are trying to read.

OK thanks. I've seen the Specification row size ... error a lot and wasn't sure if this one was from the same category.

To be a bit more specific: I'm not sure if that is the only thing that can cause this error, but it's the only thing that I've personally had cause it.

Do you know if it is reasonable to expect an update from the maintainers? Or do you think I will have more luck fixing this myself?

checks project's commit history

It seems that some people occasionally submit specification updates, but I don't see a standard release cycle anywhere.

Generally, if I have a spec error I fix it myself. (There are instructions for how to name different types of fields in fields.py). If you do so, consider submitting your spec update as a PR, so that everyone can benefit.

If you wait, there is a chance someone might come along and update it, but there is no official update strategy/deadline afaik.

E: I imagine many people simply update the spec for just the files that they need to reference, and leave the rest.