2017-05-19 6 views
0

struct.unpack을 사용하여 데이터가 고정 된 방식으로 전달되지 않기 때문에 전송되는 bytearray의 데이터를 확인하는 방법을 모르겠습니다. 16 진수 문자로 끝나는 가변 길이의 팩 십진 형식입니다. 데이터 유형은 SQL_DECIMAL입니다. 나는 123을 기대하고있는 경우pyodbc 출력 변환기에서 데이터를 압축 해제 할 수 없습니다.

예를 들어, 나는 윈도우 7에, 파이썬 3.4.3 pyodbc 4.0.1을 사용하고

...... \ X12 \ X3E로 인쇄 된 ByteArray 값을 볼 수 이 "갈 거예요 [보내고]를 nybbles"자격 또는 충분 "파이썬"인 경우

+0

그래서 1234는'\ x12 \ x34'이고 12345는'\ x12 \ x34 \ x5e'가 될 것입니까? –

+0

예. 1234는 \ x12 \ x34 \ xe0입니다. BTW, nybbles를 구문 분석하는 코드를 작성했지만 파이썬적인 것을 원합니다. – ZevGriner

답변

0

는 나도 몰라,하지만이 작동하는 것 같다 : 테스트 데이터 b'\x12\x34\xe0'를 들어

import itertools 


def convert_packed_decimal(byte_stream): 
    digit_list = list(itertools.chain.from_iterable([[(b & 0xF0) >> 4, b & 0xF] for b in byte_stream])) 
    num_digits = digit_list.index(0xE) 
    return sum([digit_list[i] * 10 ** (num_digits - i - 1) for i in range(num_digits)]) 


if __name__ == '__main__': 
    print(convert_packed_decimal(b'\x12\x34\xe0')) 
    print(convert_packed_decimal(b'\x90\x21\x0e')) 

, 함수의 첫 번째 행은 e에 대한 목록 이해력을 사용합니다. 중첩리스트

[[1,2],[3,4],[14,0]] 

에 xtract 개별 숫자 다음 list(itertools.chain.from_iterable(... 간단한리스트에 평평.

[1,2,3,4,14,0] 

번째 행 (이 경우, 4) 우리 프로세스의 자릿수를주는 0xE (14 진수) 터미네이터의 인덱스를 찾는다.

세번째 줄

[1 * 1000, 2 * 100, 3 * 10, 4 * 1] 

리스트에서의 위치에 대응하는 (10)의 힘에 의해 그 승산 각 숫자를 처리하는 지능형리스트를 사용하고 sum(... 그들을 가산.