2014-10-02 3 views
0

파이썬에서 소켓을 통해 A-D 변환기에서 데이터 스트림을 읽습니다. 데이터는 미가공 바이트로 제공됩니다. 이 바이트를 int32로 포맷하고 ndarray에 저장하려고합니다. 읽기 과정은 다음과 같은 :파이썬에서 문자열을 ndarray로 변환합니다.

def datarecv(): 
    global msgbuf 
    binlen = BURSTLEN + 4 
    while len(msgbuf) < binlen: 
     msgbuf = msgbuf + socket.recv(4096) 
    reply = msgbuf[0:binlen] 
    msgbuf = msgbuf[binlen:] 
    # each recv comes with a 4 byte header that I throw away... 
    return reply[4:] 

다음은 파일에 수신 된 데이터를 쓸 성공적으로 사용되어 다음

with open(filename, "wb') as f: 
    bytesremaining = framesize 
    for i in range(lines): 
     f.write(datarecv()[0:min(linesize, bytesremaining)]) 
     bytesremaining -= linesize 

그때 나는 이런 식으로 뭔가를 사용하여 파일을 다시 읽을 수 있습니다

>>> data = numpy.fromfile(filename, dtype='int32') 
>>> type(data) 
<type 'numpy.ndarray'> 

그래서 내 데이터 변수는 내가 찾고있는 형식입니다. IE

>>> data[1:10] 
array([4214234234, 2342342342, 2342342342, 34534535, 345345353, 5675757, 
     2142423424, 35334535, 35353535, 4754745754], dtype=int32) 

** 그러나 ** 파일에 기록하는 중간 단계는 생략하고 싶습니다. 원시 데이터 스트림을 읽은 후에 데이터를 조작 할 수 있도록 데이터 배열을 ndarray로 만들고 싶습니다. 나는

 bigbuf = bigbuf + datarecv()[0:min(linesize, bytesremaining)] 

 f.write(datarecv()[0:min(linesize, bytesremaining)]) 

에서 라인을 변경할 수 있습니다 후 나는 큰 문자열로 끝낸다. 그것은 32 비트 정수로 변환해야하는 원시 바이트 문자열 (ASCII가 아님)입니다. 나는이 마지막 단계에서 끊어졌다. 이것이 내가 바라는 것이 의미가 있기를 바랍니다. 감사.

답변

1

당신은 예를 들어 numpy.fromstring

와 배열에 bigbuf을 변환 할 수 있습니다

In [21]: bigbuf = "\1\0\0\0\2\0\0\0" 

In [22]: fromstring(bigbuf, dtype=np.int32) 
Out[22]: array([1, 2], dtype=int32) 
+0

완벽, 내가 필요 정확히. 고맙습니다! – astronomerdave

관련 문제