# -*- coding: utf-8 -*-
from distutils import sysconfig
from struct import unpack
import ctypes as C
import os
import platform
# Import shared libsegy depending on the platform.
# create library names
lib_names = [
# platform specific library name
'libsegy-%s-%s-py%s' % (platform.system(), platform.architecture()[0],
''.join([str(i) for i in platform.python_version_tuple()[:2]])),
# fallback for pre-packaged libraries
'libsegy']
# get default file extension for shared objects
lib_extension, = sysconfig.get_config_vars('SO')
# initialize library
clibsegy = None
for lib_name in lib_names:
try:
clibsegy = C.CDLL(os.path.join(os.path.dirname(__file__), os.pardir,
'lib', lib_name + lib_extension))
except Exception, e:
pass
else:
break
if not clibsegy:
msg = 'Could not load shared library for obspy.segy.\n\n %s' % (e)
raise ImportError(msg)
[docs]def unpack_header_value(endian, packed_value, length, special_format):
"""
Unpacks a single value.
"""
# Use special format if necessary.
if special_format:
format = '%s%s' % (endian, special_format)
return unpack(format, packed_value)[0]
# Unpack according to different lengths.
elif length == 2:
format = '%sh' % endian
return unpack(format, packed_value)[0]
# Update: Seems to be correct. Two's complement integers seem to be
# the common way to store integer values.
elif length == 4:
format = '%si' % endian
return unpack(format, packed_value)[0]
# The unassigned field. Since it is unclear how this field is
# encoded it will just be stored as a string.
elif length == 8:
return packed_value
# Should not happen
else:
raise Exception