2016-10-05 10 views
1

私は16進数の数字を表す文字列を持っています。これをベース64に変換したいと思います。どのようにすればいいですか?この提案はどのように機能しますか?私はそれがどのように動作するのか理解している必要があります。ベース64と他のベースへの16進数

私が考えた最初のことは、ペンと紙を使って作業するときに進めるような単純なアルゴリズムを実装していたことでした。(Pythonにこの種のものが組み込まれているとは思いますが)。

私はこれをインターネット上で検索することで実装できますが、どのように動作するかを理解する必要があります。

あなたに私は必要な説明のアイデアを与えるためにいくつかのサンプルの質問:

  • あなたの答えは、あなたは彼らが何であるかを説明してください可能性がタイプb'...'の文字列を必要とする理由b64encode()は唯一のオブジェクトを受け入れるように思わなければ引数としてこの型?
  • なぜint()は36までしか動作しません。どのようにして一般的にさまざまな基盤間の変換を細かく処理できますか?ソリューションにこの機能が含まれる場合、さらに説明できますか?

だから誰でも私にここでいくつかの指摘を与えることができます。このタイプの知識はすでに予想されているように、私はドキュメンテーションから多くを抽出することができません。

ありがとうございました。

+0

ベース36の問題は、エンコードされる可能性があります(エンコードする26文字と10個の数字は、 '10 = A 'を使って出力するだけです) – AER

+0

私ができること> 36の間を簡単に変換するのに使用しますか? – scarlett

+0

'b"という文字列に関するご質問に関してhi scarlett "'この質問を参照してください:http://stackoverflow.com/questions/6269765/what-does-the-b-character-do-in-front-文字列リテラル –

答えて

2

に任意のアルファベットで任意の文字列を変換する機能です。

import base64 
x=int('0xABCDEF01',base=16) 
print("x : ",x) 
b=x.to_bytes(length=4,byteorder='big') 
print("b : ",b) 
e=base64.b64encode(b) 
print("e : ",e) 
b2=base64.b64decode(e) 
print("b2 : ",int(b2.hex(),base=16)) 

出力:

x : 2882400001 
b : b'\xab\xcd\xef\x01' 
e : b'q83vAQ==' 
b2 : 2882400001 

いくつかの(長い)説明:私たちは、文字列内の六角で開始し、何も特別な、intは、通常の整数にそれを回すためにベースと一緒にそれを取るx 。 Pythonにxは、ほとんどの場合、基数10で印刷される数値を表すビットの束です。 x.to_bytesを使用してビット表現を尋ねることができます。結果は、b'...'として出力される一連のバイトで、印刷プロセスは自動的にバイトをASCIIキャラクタに変換しようとします。つまり、与えられたバイトがASCII文字に関連付けられていない場合は\xabのようなものになります。したがって、通常はファイルを処理するために通常使用されるb64encodeにバイトを送り、そのバイトオブジェクトの要件は、というASCII文字列をバイトオブジェクトとして吐き出します。その結果、逆のプロセスも同様です:b64 ascii-string - > 2進数(バイト数) - > hex - > int。

+0

'b64encode'はASCII文字列を返すのですか?例えば、' q'の最初の 'q'は、コンピュータの場合、その文字列は、私たちのために表現しているもの(Base-64の数字)とは異なる数字ですか? – scarlett

+0

Base64の目的は、データの生のバイトを取ることですasciiとして印刷可能ではないかもしれない)をASCIIメッセージにコピーして貼り付けることができます。だから** b64の実際の/期待される出力はあなたが読むことができる文字シーケンスです**。しかし、あなたが指摘したように、コンピュータ(とPython)の場合、それらの文字は単なる一連のバイトです。 Pythonが実際に '' e.decode( "ascii") 'と呼ぶはずのアスキー文字列であることを理解させるためです。 – jadsq

1

は「aaccffdde5e5ff」

import binascii,base64 
input_str = 'aaccffdde5e5ff' 
dehexed_str = binascii.unhexlify(input_str) 
base64_str = base64.b64encode(dehexed_str) 

b'...'の入力を前提としているだけでは、base10がこれを見るために、任意の基本変換を処理するために

as_bytes = u'hello world'.encode('utf-8')

でバイトに、通常のUnicode文字列をエンコードすることができますバイト文字列チュートリアル

http://mathbits.com/MathBits/CompSci/Introduction/tobase10.htm

はここにここでは、B64エンコードされた文字列に16進数文字列から変換するプロセスの谷歩くコードは10進数10

def int10(s,alphabet): 
    base = len(alphabet) 
    return sum([alphabet.index(c)*base**i for i,c in enumerate(s[::-1])]) 

hexAlphabet="abcdef" 
print(int10('f3',hexAlphabet)) 
関連する問題