Traversing a binary

Erik Stenman <>
Tue Sep 21 22:52:09 CEST 2004


Javier París Fernández wrote:

>On Tue, Sep 21, 2004 at 09:45:05AM -0700, Thomas Lindgren wrote:
>  
>
>>The C code will be difficult to beat in this sort of
>>program. I can't see any obvious way to improve on the
>>program above either. (Though I wonder if you really
>>want '+' or 'bxor' in the above?)
>>    
>>
>
>It's the Tcp checksum, and it is defined that way in the 
>rfc. I agree that it is a bit strange.
>  
>
I'm no Tcp expert, but are you sure?
Is it not defined as the 16-bit 1's complement sum?
I.e. something like:
'+'(A,B) ->
    S = A + B,
    S band 16#ffff + (S bsr 16).

One problem with your code is that it generates bignums (heap-allocated 
large integers),
but if it is the 16-bit 1's complement sum, then you don't need large 
integers.

You could also traverse the binary without creating new sub-binaries, by 
keeping
track of how many byte-pairs you have seen (N):

c(N,Bin,Csum) ->
    case Bin of
    <<_:N/binary, Num:16/integer,_/binary>> ->
        c(N+2,Bin,'+'(Csum,Num));
        <<_:N/binary, Num:8/integer>> ->
        '+'(Csum,Num bsl 8);
    _ -> Csum
    end.

Unfortunately even with these two changes the code does not become much 
faster...
I have attached a test program that calculates the checksum in 4 
different ways,
and prints the execution times in microseconds, but the function c/3 
above is the fastest.

/Erik
 - I'm Happi, you should be happy.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20040921/7df7fef6/attachment.html>
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: tc.erl
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20040921/7df7fef6/attachment.ksh>


More information about the erlang-questions mailing list