Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > Set parity of a string

Reply
Thread Tools

Set parity of a string

 
 
snacktime
Guest
Posts: n/a
 
      01-23-2005
Is there a module that sets the parity of a string? I have an
application that needs to communicate with a host using even parity
So what I need is before sending the message, convert it from space to
even parity. And when I get the response I need to convert that from
even to space parity.

The perl module String:arity is what I have used to do this under perl.

Chris
 
Reply With Quote
 
 
 
 
Peter Hansen
Guest
Posts: n/a
 
      01-24-2005
snacktime wrote:
> Is there a module that sets the parity of a string? I have an
> application that needs to communicate with a host using even parity
> So what I need is before sending the message, convert it from space to
> even parity. And when I get the response I need to convert that from
> even to space parity.


By what means are the messages being delivered? I've rarely
seen parity used outside of simple RS-232-style serial communications.
Certainly not (in my experience, though it's doubtless been done)
in TCP/IP based stuff. And if it's serial, parity can be
supplied at a lower level than your code.

As to the specific question: a module is not really required.
The parity value of a character depends only on the binary
value of that one byte, so a simple 128-byte substitution
table is all you need, plus a call to string.translate for
each string.

-Peter
 
Reply With Quote
 
 
 
 
Peter Hansen
Guest
Posts: n/a
 
      01-24-2005
Peter Hansen wrote:
> snacktime wrote:
>> Is there a module that sets the parity of a string?

>
> As to the specific question: a module is not really required.


But here's one for you anyway. It raises an exception if any
input character is non-ASCII, otherwise when you call set_parity()
with a string and a parity parameter of 'even', 'mark', 'none',
'odd', or 'space', it returns a string of the same length with
the high (parity) bits set appropriately.

'''parity module for python'''
# Copyright 2005 Engenuity Corporation
# Released under the "MIT license"
# at http://www.opensource.org/licenses/mit-license.php


import string
import operator


def _makeTable(parity):
bitMap = {'even': [0,128], 'odd': [128,0], 'mark': [128,128]}
table = []
for c in range(12:
even_odd = (sum(bool(c & 1<<b) for b in range()) & 1
cp = chr(c | bitMap.get(parity, [0,0])[even_odd])
table.append(cp)
table.extend(chr(c) for c in range(128, 256))
table = ''.join(table)
return table, table[128:]


_map = {}
for parity in 'even odd mark space none'.split():
_map[parity] = _makeTable(parity)


def set_parity(data, parity='none'):
'''return string with parity bits, accepting only ASCII characters
(0..127) as input'''
out = string.translate(data, *_map[parity.lower()])
if len(out) != len(data):
raise ValueError('non-ASCII characters in input')
else:
return out


if __name__ == '__main__':
print 'Running self-tests for parity.py'

# check for invalid input handling
for input in [ '\xff', '\x80', 'test\xA0ing' ]:
try:
set_parity(input)
except ValueError:
pass
else:
assert False, 'no exception for non-ASCII input'

# check for various valid inputs
for i, (parity, input, expected) in enumerate([
('space', 'test', 'test'),
('SPACE', '\x00\x7f', '\x00\x7f'),
('mark', 'test', '\xf4\xe5\xf3\xf4'),
('Odd', '\x00test\x7f', '\x80\xf4\xe5s\xf4\x7f'),
('even', '\x00\x01\x02\x03test\x7d\x7e\x7f',
'\x00\x81\x82\x03te\xf3t\x7d\x7e\xff'),
]):
actual = set_parity(input, parity)
assert expected == actual, 'case %d: %r != %r' % (i, expected, actual)

print 'All tests passed.'
 
Reply With Quote
 
John Machin
Guest
Posts: n/a
 
      01-24-2005

Peter Hansen wrote:
> snacktime wrote:
> > Is there a module that sets the parity of a string? I have an
> > application that needs to communicate with a host using even parity


> > So what I need is before sending the message, convert it from space

to
> > even parity. And when I get the response I need to convert that

from
> > even to space parity.

>
> By what means are the messages being delivered? I've rarely
> seen parity used outside of simple RS-232-style serial

communications.
> Certainly not (in my experience, though it's doubtless been done)
> in TCP/IP based stuff. And if it's serial, parity can be
> supplied at a lower level than your code.
>
> As to the specific question: a module is not really required.
> The parity value of a character depends only on the binary
> value of that one byte, so a simple 128-byte substitution
> table is all you need, plus a call to string.translate for
> each string.
>
> -Peter


And for converting back from even parity to space parity, either a
256-byte translation table, or a bit of bit bashing, like chr(ord(c) &
127), on each byte.

The bank story sounds eminently plausible to me. Pick up old system
where branch manager had to dial HO every evening, insert phone into
acoustic coupler, etc etc and dump it on the internet ...

 
Reply With Quote
 
snacktime
Guest
Posts: n/a
 
      01-24-2005
On Sun, 23 Jan 2005 21:00:25 -0500, Peter Hansen <(E-Mail Removed)> wrote:
> Peter Hansen wrote:
> > snacktime wrote:
> >> Is there a module that sets the parity of a string?

> >
> > As to the specific question: a module is not really required.

>
> But here's one for you anyway. It raises an exception if any
> input character is non-ASCII, otherwise when you call set_parity()
> with a string and a parity parameter of 'even', 'mark', 'none',
> 'odd', or 'space', it returns a string of the same length with
> the high (parity) bits set appropriately.


Thanks for the code example, I'm not quite up to speed on python
enough to make this a trivial exercise as of yet.

Chris
 
Reply With Quote
 
snacktime
Guest
Posts: n/a
 
      01-26-2005
I'm trying to figure out why the following code transforms ascii STX
(control-b) into "\x82". The perl module I use returns a value of
"^B", and that is also what the application I am communicating with
expects to see. Some ascii characters such as FS and GS come through
fine, but STX and ETX get transformed incorrectly (at least for what I
need they do).

What am I missing here?

Chris

> But here's one for you anyway. It raises an exception if any
> input character is non-ASCII, otherwise when you call set_parity()
> with a string and a parity parameter of 'even', 'mark', 'none',
> 'odd', or 'space', it returns a string of the same length with
> the high (parity) bits set appropriately.
>
> '''parity module for python'''
> # Copyright 2005 Engenuity Corporation
> # Released under the "MIT license"
> # at http://www.opensource.org/licenses/mit-license.php
>
> import string
> import operator
>
> def _makeTable(parity):
> bitMap = {'even': [0,128], 'odd': [128,0], 'mark': [128,128]}
> table = []
> for c in range(12:
> even_odd = (sum(bool(c & 1<<b) for b in range()) & 1
> cp = chr(c | bitMap.get(parity, [0,0])[even_odd])
> table.append(cp)
> table.extend(chr(c) for c in range(128, 256))
> table = ''.join(table)
> return table, table[128:]
>
> _map = {}
> for parity in 'even odd mark space none'.split():
> _map[parity] = _makeTable(parity)
>
> def set_parity(data, parity='none'):
> '''return string with parity bits, accepting only ASCII characters
> (0..127) as input'''
> out = string.translate(data, *_map[parity.lower()])
> if len(out) != len(data):
> raise ValueError('non-ASCII characters in input')
> else:
> return out
>
> if __name__ == '__main__':
> print 'Running self-tests for parity.py'
>
> # check for invalid input handling
> for input in [ '\xff', '\x80', 'test\xA0ing' ]:
> try:
> set_parity(input)
> except ValueError:
> pass
> else:
> assert False, 'no exception for non-ASCII input'
>
> # check for various valid inputs
> for i, (parity, input, expected) in enumerate([
> ('space', 'test', 'test'),
> ('SPACE', '\x00\x7f', '\x00\x7f'),
> ('mark', 'test', '\xf4\xe5\xf3\xf4'),
> ('Odd', '\x00test\x7f', '\x80\xf4\xe5s\xf4\x7f'),
> ('even', '\x00\x01\x02\x03test\x7d\x7e\x7f',
> '\x00\x81\x82\x03te\xf3t\x7d\x7e\xff'),
> ]):
> actual = set_parity(input, parity)
> assert expected == actual, 'case %d: %r != %r' % (i, expected, actual)
>
> print 'All tests passed.'
> --
> http://mail.python.org/mailman/listinfo/python-list
>

 
Reply With Quote
 
snacktime
Guest
Posts: n/a
 
      01-26-2005
Correction on this, ETX is ok, it seems to be just STX with the data I am using.

Chris


On Wed, 26 Jan 2005 11:50:46 -0800, snacktime <(E-Mail Removed)> wrote:
> I'm trying to figure out why the following code transforms ascii STX
> (control-b) into "\x82". The perl module I use returns a value of
> "^B", and that is also what the application I am communicating with
> expects to see. Some ascii characters such as FS and GS come through
> fine, but STX and ETX get transformed incorrectly (at least for what I
> need they do).

 
Reply With Quote
 
snacktime
Guest
Posts: n/a
 
      01-26-2005
Argh, never mind my mistake. I wasn't logging the data correctly the
parity conversion works fine.

Chris
 
Reply With Quote
 
Peter Hansen
Guest
Posts: n/a
 
      01-26-2005
snacktime wrote:
> Correction on this, ETX is ok, it seems to be just STX with the data I am using.


> On Wed, 26 Jan 2005 11:50:46 -0800, snacktime <(E-Mail Removed)> wrote:
>
>>I'm trying to figure out why the following code transforms ascii STX
>>(control-b) into "\x82". The perl module I use returns a value of
>>"^B", and that is also what the application I am communicating with
>>expects to see. Some ascii characters such as FS and GS come through
>>fine, but STX and ETX get transformed incorrectly (at least for what I
>>need they do).


I didn't see the first post, which you quoted above... more newsfeed
or python-list misalignment I guess.

Anyway, since STX '\x02' has only one bit set, if you are setting
the parity bit for "even" parity, then naturally it will be set
(in order to make the total number of "on" bits an even number),
so you get '\x82' (which has two bits set). ETX, on the other
hand '\x03' already has two bits set, so the high bit is left alone.

It sounds as though you need to examine the specification
for the receiving system in more detail, or perhaps seek
clarification from the other party involved in this system
you're working with. If you have examples that show STX and
ETX both being transmitted, around other data which itself
has had the parity bit set for even parity, then clearly (a)
the folks involved in designing that system are idiots
<0.5 wink> and (b) you'll have to modify the way you are
forming the transmission packet. It appears they may want
the STX/ETX pair to be sent without being affected by the
parity process...

-Peter
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Parity Check Ed VHDL 18 10-06-2009 12:43 PM
string parity module snacktime Ruby 1 08-13-2006 06:23 AM
PA-2FE-TX Parity Bug ttrotter01@yahoo.com Cisco 1 03-30-2006 08:13 PM
Cisco 3640A: GT64010 Master Write Parity Error Dev Cisco 1 01-15-2006 12:47 PM
disable parity checking on cisco router how? Walter Roberson Cisco 3 01-15-2004 10:56 PM



Advertisments