Kroeger, Simon (ext)
1/6/2006 9:30:00 AM
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
>