Newbie question

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