Welcome mac,

your code below should be more or less equal to:
(no chance of testing obviously)

def ae_6 session
  pdu, pduLen = session.read(5).unpack('cN')
  buffer = session.read(pduLen)
  
  calledAETitle, callingAETitle, itemType, itemLength =
buffer.unpack('x4A16A16x35Cxn')
  
  start = 72+itemLength
  contextName=buffer.slice(72...start)
  
  while start < pduLen
    start = getNextPresentationContext(start, pdu[start..-1]) + 1
    print "Finish = ",start-1,"  outside proc\n"
  end
end

def getNextPresentationContext(start, pdu)
  it, itemLength, presContextId, itemType, itemLength =
pdu.unpack('CxnCx3Cxn')
  
  start = 12 + itemLength
  abstractSyntax=pdu[12...start]
  itemType=pdu[start]
  
  while itemType == 64
    itemLength=pdu[start+2..start+1].unpack('n')[0]
    transferSyntax=pdu[start+2...start+2+itemLength]
    
    puts "id=#{presContextId}, AbstractSyntax =#{abstractSyntax},
TxSyntax=#{transferSyntax}"
    start=start+2+itemLength+1
    itemType=pdu[start]
  end
  return start-1
end 


Hope you get the idea.

cheers

Simon

> -----Original Message-----
> From: mac [mailto:mtscolony / gmail.com] 
> Sent: Friday, January 06, 2006 5:34 AM
> To: ruby-talk ML
> Subject: Newbie question
> 
>  Hello all and happy new year. I hope this is the right 
> mailing list for
> this question. If not please redirect me and accept my 
> apologies. Thanks in
> advance.
> I just started learning Ruby. I have good experience in Java 
> and Perl and
> have read most of the doc on Ruby that I can get my hands on. 
> I started on a
> project to build the DICOM netwrok library as a way to learn 
> Ruby. I have
> done quite bit of coding on this project and have a working 
> code. Well when
> I say quite a bit, it is about 5% done!! What I am looking 
> for is RubyIdioms
> and if there are better ways of doing things as opposed to what I have
> already done. Basically DICOM messages are binary and we need 
> to read the
> data and manipulate byes. We will have to construct integers 
> or floats from
> bytes or pair of bytes and the next few bytes could be a 
> string etc. I have
> pasted some part of the code and want your opinion on this. 
> Also, once this
> project has reached a point where it could be used, I will 
> release it to the
> community.
> 
> What I am looking for is recomendation to improve the speed 
> of the code in
> processing the bytes. is 'slice' the best way to do what I am 
> doing. I am
> going to re-arrange the code, so dont worry about the neatness at this
> point.
> 
> Thans and here is the code.
> 
> session comes from
> 
> server = TCPServer.new('localhost', port)
>   p "waiting on connection"
> while (session = server.accept) ........
> 
> def ae_6 session
> #AE_6
>  p "Inside ae_6"
>  #stop ARTIM and issue and a-associate indiction primitive.
>  # all we have to do here is suck in the whole PDU, that 
> amounts to sending
> the indication primitive.
>  pdu=session.getc # reserved, neglect this byte
>  pduLen=session.read(4).unpack('N')[0] # unsigned integer 4 bytes long
>  print "PDU Length =", pduLen,"\n"
>  pdu=session.read(pduLen) # this is the full PDU
>  #version=pdu.slice(0..1).unpack('n')[0]
>  #p version
>  calledAETitle = pdu.slice(4..19) # string of 16 chars
>  callingAETitle = pdu.slice(20..35) # string of 16 chars
>  p calledAETitle
>  p callingAETitle
>  #pdu.each_byte {|c| print c,"|" }
>  #reserved=pdu.slice(36..67) # ignore this
>  #next item type should be 10H which is "Application Context" which is
> always set to "1.2.840.10008.3.1.1.1"
>  itemType=pdu.slice(68..68).unpack('C')[0]
>  #printf( "ItemType=%XH\n", itemType)
>  #ignore the next byte, byte # 69
>  itemLength=pdu.slice(70..71).unpack('n')[0]
>  contextName=pdu.slice(72..72+itemLength-1)
>  p contextName
>  # Next we read presentation context items
> 
>  start = 72+itemLength
>  finish = 0
>  while finish < pduLen
>   finish = getNextPresentationContext(start, pdu)
>   print "Finish = ",finish,"  outside proc\n"
>   start=finish+1
>  end
> end
> 
> def getNextPresentationContext(start, pdu)
>  finish = start
>  itemType=pdu.slice(start..finish).unpack('C')[0] #should be20H
>  start = finish+2 # added 2 here since we need to skip on 
> byte which is
> reserved
>  finish = start + 1 # total of two bytes
>  itemLength=pdu.slice(start..finish).unpack('n')[0]
>  #printf( "FIRST ItemType=%XH,  itemLength=%d\n", itemType,itemLength)
>  start = finish+1
>  finish = start
>  presContextId=pdu.slice(start..finish).unpack('C')[0]
>  # next 3 bytes needs to be ignored, they are reserved hence +4 below
>  start = finish +4
>  finish = start
>  itemType=pdu.slice(start..finish).unpack('C')[0]
>  start = finish+2 # added 2 here since we need to skip on 
> byte which is
> reserved
>  finish = start + 1 # total of two bytes
>  itemLength=pdu.slice(start..finish).unpack('n')[0]
>  #printf( "SECOND ItemType=%XH,  itemLength=%d\n", 
> itemType,itemLength)
>  start = finish+1
>  finish = start + itemLength-1 # total of two bytes
>  abstractSyntax=pdu.slice(start..finish)
> 
>  start = finish +1
>  finish = start
>  itemType=pdu.slice(start..finish).unpack('C')[0]
>  while itemType == 64
>   start = finish+2 # added 2 here since we need to skip one 
> byte which is
> reserved
>   finish = start + 1 # total of two bytes
>   itemLength=pdu.slice(start..finish).unpack('n')[0]
>   #printf( "LATER ItemType=%XH,  itemLength=%d\n", 
> itemType,itemLength)
>   start = finish+1
>   finish = start + itemLength-1 # total of two bytes
>   transferSyntax=pdu.slice(start..finish)
>   printf("id=%d, AbstractSyntax =%s, TxSyntax=%s\n",
> presContextId,abstractSyntax,transferSyntax)
>   start=finish+1
>   finish = start
>   itemType=pdu.slice(start..finish).unpack('C')[0]
>  end
>  return finish-1
>