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