2012-03-09 5 views
0

파이썬에서 Date를 안전한 문자열로 직렬화하고 싶습니다.파이썬에서 안전한 문자열을 URL에 날짜순으로 배열하십시오.

저는 C++에서 1970 년 1 월 1 일 이후의 초 수를 나타내는 정수를 사용 했었습니다. 그런 다음 Base64 URL 안전 문자열로 바꿀 수 있습니다. C++ 날짜는 이러한 정수를 쉽게 전달할 수 있도록 설계되었습니다.

Python에서 이상적으로 날짜를 나타내는 바이트 배열을 가져온 다음 base64.urlsafe_b64encode()로 전달하고 싶습니다. 그런 다음 직렬화를 해제하고 싶을 때 바이트를 디코딩하여 datetime 객체로 다시 전달할 수있었습니다. 하지만 파이썬에서이 작업을 수행하는 방법을 알지 못합니다.

나는 datetime.isoformat()을 사용할 수 있다고 믿지만, 불필요하게 길어 보이는 문자열이 인간이 읽을 필요가 없다고 생각합니다. 번역을 수행하는 사용자 정의 함수를 작성할 수도 있지만 가능하면 공식 라이브러리 코드를 사용하고 싶습니다.

내가 누락 된 항목이 있습니까? 이 일을하는 "쉬운"방법이 있습니까?

감사합니다.

편집 :

좋아

, 그래서 이것은 내가에 정착 것입니다. @bgporter가 아래에 제안한 내용의 변형입니다. 내 목표는 너무 많은 불필요한 공간을 차지하지 않고 url-safe 문자열로 datetime 정보를 변환하여 "int"타임 스탬프의 바이트를 직접 base64로 인코딩하는 것과 같은 코드를 수정하여 문자열로 변환하는 대신 (base64 url-encoded 일 필요는 없습니다). 그 결과 타임 스탬프는 약 8 자이며, 다음과 같습니다 a7NaTw== :

인코딩 타임 스탬프 (URL 보안 base64 문자열) :

url_safe_timestamp = base64.urlsafe_b64encode(struct.pack('L', int(time.time()))) 

디코드 타임 스탬프 (Date 객체) :

decoded_timestamp = datetime.datetime.fromtimestamp(float(struct.unpack('L', base64.urlsafe_b64decode(url_safe_timestamp))[0])) 

답변

8

당신에게 의미는 다음과 같습니다 :

>>> import base64 
>>> import time 
>>> encoded = base64.urlsafe_b64encode("%d" % int(time.time())) 
>>> print encoded 
'MTMzMTMyOTE5NA==' 
>>> decoded = int(base64.urlsafe_b64decode(encoded)) 
>>> print decoded 
1331329194 
>>> import datetime 
>>> datetime.datetime.fromtimestamp(decoded) 
datetime.datetime(2012, 3, 9, 16, 39, 54) 

?

(여기에 기본 64 인코딩 그냥 16 진수 값을 사용하는 것보다 더 나은 이유를 잘 모르겠어요? - 내가 놓친 거지 무엇을) Base64로의

+0

목적은 압축 된 정보를 유지하는 것이 었습니다. 16 진수 값은 16 진수의 값을 나타 내기 위해 문자열 문자를 사용합니다. 64 진수에서는 정보가 조금 더 압축됩니다. 이 코드를 살펴 보았지만 먼저 타임 스탬프에서 "int"를 기본 10 문자열 (숫자를 나타내는 일반 문자)로 바꿨습니다. 이것은 아마도 충분히 압축되어 있고, 개발자가 타임 스탬프가 어느시기에 왔는지 나중에 볼 수있게합니다. 기초 10 문자열에서 기초 64로 변환 할 때, 실제로 문자열이 길어 졌다고 생각합니다. –

+0

Base64는 압축이 아닙니다. 그것은 8 비트 바이트 배열을 가져 와서 Ascii 인 것으로 보이는 7 비트 배열로 바꾸는 방법입니다. 결과적으로 결과는 원본보다 더 많은 바이트가됩니다 (압축의 반대). 기수 64 표현입니다. 바이너리를 ascii 파일에 저장하려면 base64를 사용하십시오. Wiki : https://en.wikipedia.org/wiki/Base64 – Atifm

+1

참조하십시오. base64는'='를 사용하여 문자열을 3의 배수로 채우고'='는 URL 안전 문자가 아닙니다. – Jens

관련 문제