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 

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

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

Unfortunately even with these two changes the code does not become much 
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.

 - I'm Happi, you should be happy.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <>
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: tc.erl
URL: <>

More information about the erlang-questions mailing list