convert char to byte representation

Discussion in 'Python' started by Philipp H. Mohr, Oct 10, 2005.

  1. Hello,

    I am trying to xor the byte representation of every char in a string with
    its predecessor. But I don't know how to convert a char into its byte
    representation. This is to calculate the nmea checksum for gps data.

    e.g. everything between $ and * needs to be xor:
    $GPGSV,3,1,10,06,79,187,39,30,59,098,40,25,51,287,00,05,25,103,44*
    to get the checksum.


    Thank you for you help.

    Phil
    Philipp H. Mohr, Oct 10, 2005
    #1
    1. Advertising

  2. Philipp H. Mohr

    Larry Bates Guest

    ord(c) gives you decimal representation of a character.

    -Larry Bates

    Philipp H. Mohr wrote:
    > Hello,
    >
    > I am trying to xor the byte representation of every char in a string with
    > its predecessor. But I don't know how to convert a char into its byte
    > representation. This is to calculate the nmea checksum for gps data.
    >
    > e.g. everything between $ and * needs to be xor:
    > $GPGSV,3,1,10,06,79,187,39,30,59,098,40,25,51,287,00,05,25,103,44*
    > to get the checksum.
    >
    >
    > Thank you for you help.
    >
    > Phil
    Larry Bates, Oct 10, 2005
    #2
    1. Advertising

  3. Philipp H. Mohr wrote:
    > I am trying to xor the byte representation of every char in a string with
    > its predecessor. But I don't know how to convert a char into its byte
    > representation.

    ord('a') == 97; chr(97) == 'a'; "ord" gives you the value of the byte.

    > e.g. everything between $ and * needs to be xor:
    > $GPGSV,3,1,10,06,79,187,39,30,59,098,40,25,51,287,00,05,25,103,44*
    > to get the checksum.


    Probably you want a byte-array here, rather than going char-by-char.
    Try:
    import array
    base = ('$GPGSV,3,1,10,06,79,187,39,30,59,098,'
    '40,25,51,287,00,05,25,103,44*')
    bytes = array.array('b', base[1 : -1])
    for i in reversed(range(len(bytes))):
    bytes ^= bytes[i-1]
    result = bytes.tostring()

    --Scott David Daniels
    Scott David Daniels, Oct 10, 2005
    #3
  4. On 2005-10-10, Larry Bates <> wrote:

    >> I am trying to xor the byte representation of every char in a string with
    >> its predecessor. But I don't know how to convert a char into its byte
    >> representation. This is to calculate the nmea checksum for gps data.


    > ord(c) gives you decimal representation of a character.


    While ord(c) is what the OP needs, it doesn't give a decimal
    represention -- which I guess would be a string like "65" for
    the ASCII characer "A". What ord() gives you is an integer
    object with the value of the character [which the hardware
    stores in binary on all of the platforms I'm aware of].

    --
    Grant Edwards grante Yow! Hmmm... A hash-singer
    at and a cross-eyed guy were
    visi.com SLEEPING on a deserted
    island, when...
    Grant Edwards, Oct 10, 2005
    #4
  5. Philipp H. Mohr

    Rick Wotnaz Guest

    Scott David Daniels <> wrote in
    news:434ab2f6$:

    > Philipp H. Mohr wrote:
    >> I am trying to xor the byte representation of every char in a
    >> string with its predecessor. But I don't know how to convert a
    >> char into its byte representation.

    > ord('a') == 97; chr(97) == 'a'; "ord" gives you the value of the
    > byte.
    >
    >> e.g. everything between $ and * needs to be xor:
    >> $GPGSV,3,1,10,06,79,187,39,30,59,098,40,25,51,287,00,05,25,
    >> 103,44*
    >> to get the checksum.

    >
    > Probably you want a byte-array here, rather than going
    > char-by-char. Try:
    > import array
    > base = ('$GPGSV,3,1,10,06,79,187,39,30,59,098,'
    > '40,25,51,287,00,05,25,103,44*')
    > bytes = array.array('b', base[1 : -1])
    > for i in reversed(range(len(bytes))):
    > bytes ^= bytes[i-1]
    > result = bytes.tostring()
    >
    > --Scott David Daniels
    >
    >


    What is the byte representation of 287?

    --
    rzed
    Rick Wotnaz, Oct 10, 2005
    #5
  6. Philipp H. Mohr

    Peter Otten Guest

    Scott David Daniels wrote:

    > Philipp H. Mohr wrote:
    >> I am trying to xor the byte representation of every char in a string with
    >> its predecessor. But I don't know how to convert a char into its byte
    >> representation.

    > ord('a') == 97; chr(97) == 'a'; "ord" gives you the value of the byte.
    >
    >> e.g. everything between $ and * needs to be xor:
    >> $GPGSV,3,1,10,06,79,187,39,30,59,098,40,25,51,287,00,05,25,103,44*
    >> to get the checksum.

    >
    > Probably you want a byte-array here, rather than going char-by-char.
    > Try:
    > import array
    > base = ('$GPGSV,3,1,10,06,79,187,39,30,59,098,'
    > '40,25,51,287,00,05,25,103,44*')
    > bytes = array.array('b', base[1 : -1])
    > for i in reversed(range(len(bytes))):
    > bytes ^= bytes[i-1]
    > result = bytes.tostring()


    Seems like the OP doesn't need what he asked for. The simpler

    def checksum(s):
    assert s[0] == "$"
    assert s[-1] == "*"
    result = 0
    for c in s[1:-1]:
    result ^= ord(c)
    return result

    should do.

    Peter
    Peter Otten, Oct 10, 2005
    #6
  7. Philipp H. Mohr

    Larry Bates Guest

    I've always read it written that the number that is returned by
    ord(c) is the "decimal" (not hex, not octal) representation of
    the ASCII/UNICODE character that is stored in memory location
    pointed to by variable c. While the result is an integer (as
    it couldn't really be anything else), I believe that most
    character charts list the number that ord() returns as the
    "decimal representation" of that character (as they normally
    also show the octal and hex values as well).

    Probably an "old school" answer on my part.

    -Larry Bates

    Grant Edwards wrote:
    > On 2005-10-10, Larry Bates <> wrote:
    >
    >
    >>>I am trying to xor the byte representation of every char in a string with
    >>>its predecessor. But I don't know how to convert a char into its byte
    >>>representation. This is to calculate the nmea checksum for gps data.

    >
    >
    >>ord(c) gives you decimal representation of a character.

    >
    >
    > While ord(c) is what the OP needs, it doesn't give a decimal
    > represention -- which I guess would be a string like "65" for
    > the ASCII characer "A". What ord() gives you is an integer
    > object with the value of the character [which the hardware
    > stores in binary on all of the platforms I'm aware of].
    >
    Larry Bates, Oct 11, 2005
    #7
  8. Philipp H. Mohr

    Mike Meyer Guest

    [Format recovered from top posting.]

    Larry Bates <> writes:
    > Grant Edwards wrote:
    >> On 2005-10-10, Larry Bates <> wrote:
    >>>>I am trying to xor the byte representation of every char in a string with
    >>>>its predecessor. But I don't know how to convert a char into its byte
    >>>>representation. This is to calculate the nmea checksum for gps data.

    >>
    >>>ord(c) gives you decimal representation of a character.

    >>
    >> While ord(c) is what the OP needs, it doesn't give a decimal
    >> represention -- which I guess would be a string like "65" for
    >> the ASCII characer "A". What ord() gives you is an integer
    >> object with the value of the character [which the hardware
    >> stores in binary on all of the platforms I'm aware of].

    >
    > I've always read it written that the number that is returned by
    > ord(c) is the "decimal" (not hex, not octal) representation of
    > the ASCII/UNICODE character that is stored in memory location
    > pointed to by variable c. While the result is an integer (as
    > it couldn't really be anything else), I believe that most
    > character charts list the number that ord() returns as the
    > "decimal representation" of that character (as they normally
    > also show the octal and hex values as well).


    The value returned by ord is a *number*. That number has a decimal
    representation. It also has a hex representation and an octal
    representation. These are all strings, and they all represent the same
    number. You can't print a number - you can only print characters. So
    Python (indeed, most languages) translate the number into a string of
    characters that represent the number, using the decimal
    representation. You can use the hex and oct builtins to ask for the
    hex and octal representations of that number and print those strings
    if you want.

    > Probably an "old school" answer on my part.


    The decimal representation of ' ' is '32'. Python doesn't think that
    that's what ord(' ') returns:

    >>> ord(' ') == '32'

    False

    So I'd say it was "wrong" rather than old school.

    On the other hand, if you check ord(' ') against numbers, it doeesn't
    care what representation you use, so long as they represent the same
    number:

    >>> ord(' ') == 0x20

    True
    >>> ord(' ') == 040

    True
    >>> ord(' ') == 32

    True

    Of course you can't read a number any more than you can write one, so
    Python kindly translates strings representing numbers into numbers
    when itt reads them. This process is often referred to as "reading a
    number", but what's actually read is characters.

    <mike
    --
    Mike Meyer <> http://www.mired.org/home/mwm/
    Independent WWW/Perforce/FreeBSD/Unix consultant, email for more information.
    Mike Meyer, Oct 11, 2005
    #8
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Shane Wealti

    convert byte[] to Byte[]

    Shane Wealti, Jun 13, 2005, in forum: Java
    Replies:
    5
    Views:
    42,158
    Brzezi
    Jun 13, 2005
  2. Richard
    Replies:
    11
    Views:
    1,076
    Adam Maass
    Feb 1, 2006
  3. godavemon
    Replies:
    6
    Views:
    1,841
    Cameron Laird
    Jun 14, 2006
  4. lovecreatesbeauty
    Replies:
    1
    Views:
    1,034
    Ian Collins
    May 9, 2006
  5. =?utf-8?B?Qm9yaXMgRHXFoWVr?=
    Replies:
    3
    Views:
    435
    John Machin
    Sep 15, 2007
Loading...

Share This Page