Michael Cotherman wrote:
I am a noob to converting pointers in C++ to arrays in
python, although the first time I see it done, I will
have no problem. Can you help converting the below
(what I think is the 'decoder' section) to python?
OK I'll bite. Your code is copying from a src buffer to a dst buffer. The src
buffer has a count byte followed by count-1 bytes of data. If the count is less
that 0xFF, a zero byte has to be inserted into the dst. So the decode loop gets
a count, copies that many bytes to the dst buffer, then optionally appends a 0.
Python doesn't have a direct equivalent to this sort of manipulation of memory
pointers and raw memory buffers. They are commonly replaced by strings or
lists. My function takes a string as an input argument, builds the output as
string fragments in a list, then builds a string to return.
Note that Python strings include an implicit length so there is no need to pass
and return a length argument.
I included a test case with the data from your previous email. Your data is
evidently hex-encoded as well as COBS encoded - in other words your strings are
hex values where each two chars represent a single byte. I have converted to
and from byte strings to feed this to the decoder.
Kent
PS Please send your replies to the whole list, not to me personally. Thanks!
def unstuff(src):
# src is a COBS compressed string
current = 0 # index into src
dst = []# a list that will build the result
while current len(src):
# Get the count and convert it to an integer
count = ord(src[current])
# Append count-1 chars from src to dst
dst.append(src[current+1:current+count])
# Do we need to add a zero byte?
if count 0xFF:
dst.append('\x00')
# Bump the counter and continue
if count0:
current += count
else:
current += 1
# dst is a list of string fragments; this converts it to a single string
return ''.join(dst)
def hexToString(hexStr):
''' Convert a string of two-digit hex values to a string of bytes with
those values '''
return ''.join([chr(int(hexStr[i:i+2], 16)) for i in range(0, len(hexStr),
2)])
def stringToHex(src):
''' Convert a byte string to a string of two-digit hex values '''
return ''.join([ '%02x' % ord(s) for s in src ])
if __name__ == '__main__':
data = '0002860104DB203F0100'
print data
data = hexToString(data)
print
newData = unstuff(data)
print stringToHex(newData)
UINT CCobsPackets::UnStuffData(unsigned char *src,
unsigned char *dst, UINT length)
{
unsigned char *dstStart = dst;
unsigned char *end = src + length;
while (src end)
{
int i, code = *src++;
for (i=1; icode; i++)
{
*dst++ = *src++;
}
if (code 0xFF)
{
*dst++ = 0;
}
}
return (UINT)(dst - dstStart);
}
___
Tutor maillist - Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor