2017-05-07 9 views
0

次のPHPコードをPythonで書き直そうとしていますが、それを行う方法がわかりません。私のバイト、16進数、バイナリの経験はほとんどありません。私はこれを非常に混乱させています。PythonでMySQLバイナリ(8)フィールドに挿入

 $code_string = "0000000000000248";  
     $code_array = array(); 
     $tokens = str_split($code_array, 2); 

     foreach ($tokens as $token) { 
      $byte = hexdec($token); 
      array_push($code_array, $byte); 
     } 

     $code_blob = pack("C*", 
       $code_array[0], 
       $code_array[1], 
       $code_array[2], 
       $code_array[3], 
       $code_array[4], 
       $code_array[5], 
       $code_array[6], 
       $code_array[7] 
      ); 

     $sql = "INSERT INTO some_table (code) VALUES ($code_blob)" 

"code"フィールドはMySQLバイナリ(8)タイプです。 PHPで上記のコードを実行すると、コードは問題なく挿入されます。 phpMyAdminでは、レコードを見ると "0000000000000248"と表示されます。

私は、これは有用な情報があるのか​​はわからないが、私は一つ一つのトークンを印刷するとき、私はそれがこの

INSERT INTO some_table (code) VALUES ('H') 

のように見えるSQLを印刷するとき、彼らはこの

 foreach ($tokens as $token) { 
      $byte = hexdec($token); 
      array_push($code_array, $byte); 
      echo "$byte "; 
     } 

     // looks like 0 0 0 0 0 0 2 72 

のように見えますPython(3.4)でこれを行う方法がわかりません。

正しい答えはtmadamにありがとうございます。ただ、メモとして、あなたは文字列は「...」Bのように見えるとSQLを中断しますPythonで文字列に直接ブロブを置く場合は、この

sql = "INSERT INTO some_table (code) VALUES (%s)" 
    cursor.execute(sql, (code_blob,)) 
    db.commit() 

のようにそれを行う必要があるデータベースに挿入します。

答えて

1

PHPコードではからhexdec関数で小数の配列を作成し、この配列を使用してpack関数の文字列を作成します。
Pythonの同等:

from struct import pack 

code_string = '0000000000000248' 
code_array = [ int(code_string[i:i+2], 16) for i in range(0, len(code_string), 2) ] 
code_blob = pack('B'*len(code_array), *code_array) 
#code_blob = ''.join(chr(i) for i in code_array) ## pack alternative ## 

結果:

print(code_array) 
print(code_blob) 

[0, 0, 0, 0, 0, 0, 2, 72] 
'  ☻H' 
関連する問題