pythonic malloc

Bengt Richter bokr at oz.net
Mon Jul 21 19:22:46 EDT 2003


On Mon, 21 Jul 2003 10:32:08 GMT, Brad Hards <bhards at bigpond.net.au> wrote:

>Karl Scalet wrote:
>
>> kjockey schrieb:
>>> I have some simple UDP code that does:
>>>
>s.sendto("\xf0\x00\x02\x00rachel\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",addr)
>>> 
>>> This is OK, except that I'd like to change the text in the middle
>>> ("rachel", which is the hostname FWIW), and the NUL padding needs to go
>>> out to make the length 25 bytes (so the padding depends on the length of
>>> the name).
>>> 
>>> So I could do something like:
>>> retpacket = "\xf0\x00\x02\x00"+socket.gethostname()
>>> while len(retpacket) < 26:
>> 
>> shouldn't that be 25?
>Yes.
>
>>>      retpacket += "\x00"
>>> s.sendto(retpacket, addr)
>>> 
>>> But that feels "wrong". And Python in a Nutshell says its a bad idea  -
>>> "anti-idiom".
Well, adding the same character one by one is about as ugly as
    sum = 14
    while sum <25:
        sum += 1
(Of course, if the original 14 units are also the same, as in integers,
    sum += 25-sum
is not much better ;-)

But for small strings, I don't think it should be a big deal to do something like

    retpacket = "\xf0\x00\x02\x00"+socket.gethostname()
    retpacket += '\x00'*(25-len(retpacket))


>>> 
>>> Can anyone show me the true path?
>> 
>> No idea, if it's the true path:
>> 
>> hn = socket.gethostname()
>> retpacket = '\xf0\x00\x02\x00%s%s' % (hn, (25-4-len(hn))*chr(0))
>> s.sendto(retpacket, addr)
>Probably better for efficiency, but not much for readability....
>
>Anyone else?

another alternative (untested!):

    fmt = '\xf0\x00\x02\x00%s'+21*'\x00' # or write it out ;-)
    ...
    retpacket = (fmt%socket.gethostname())[:25]
    s.sendto(retpacket, addr)

Regards,
Bengt Richter




More information about the Python-list mailing list