🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1592閲覧

Python padding処理した後、分ける

退会済みユーザー

退会済みユーザー

総合スコア0

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/10/25 05:41

編集2019/10/25 05:42

pythonで16進数表記された数字群を0でパディング(512bitに、16進数表記なら128桁に)した後に、32bit毎(16進数なら8桁ごと)に16分割したいです。
自分の感覚では、2進数表記した桁数がビット数でもあるので、それを求めた後に512-nビット左シフトします。
そのあとに、最初の8桁なら右に512-32桁右シフト、二番目の8桁なら512-64シフトしたのに0x00001111の排他的論理和をとり、・・・

具体的に書きます。

入力値が以下なら
0x0000111122223333444455556666777788889999aaaabbbbccccddddeeeeffff0011223344556677

0000 1111 2222 3333 4444 5555 6666 7777 8888 9999 aaaa bbbb cccc dddd eeee ffff
0011 2233 4455 6677
と分解し
0000 1111 2222 3333 4444 5555 6666 7777 8888 9999 aaaa bbbb cccc dddd eeee ffff
0011 2233 4455 6677 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
のようにしたいです。
その後、
W[0] ~ W[15]までの配列に
W[0] = 00001111
W[1] = 22223333



W[15] = 00000000
のようにしたいです。

以下は自身で実装した内容ですが、パディングの時点でエラーがはかれてしまいました。

自身が作りたいのは以下のサイトと同じアルゴリズムです。
一応載せておきます。
参照

どなたかご教授願えると幸いです。

python

1x = 0x0000111122223333444455556666777788889999aaaabbbbccccddddeeeeffff0011223344556677 2 3y = bin(x) 4 5x = (512 - len(y)) >> x 6 7print(x)

error

1--------------------------------------------------------------------------- 2OverflowError Traceback (most recent call last) 3<ipython-input-13-db2ffbe8a3ee> in <module>() 4 3 y = bin(x) 5 4 6----> 5 x = (512 - len(y)) >> x 7 6 8 7 print(x) 9 10OverflowError: Python int too large to convert to C ssize_t

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

matobaa

2019/10/25 16:14

worksforme。python.org からダウンロードしたWindows版Python3.8(64bit)でエラーなく動作してます。https://www.python.org/shell/ でも問題ないです。乗り換えることはできますか? ところで5行目は x = x << (512 - len(y)) の間違いじゃなかろうか。これならなんとか Colaboratory でも動かせそう
退会済みユーザー

退会済みユーザー

2019/10/26 01:25

しかし、 x = x << (512 - len(y))にしてしまうと、先頭の0000が失われてしまい 自分が欲しい結果を得られない可能性が高いと思います。
guest

回答1

0

ベストアンサー

こんな感じになりました。

Python

1import math 2 3x = 0x0000111122223333444455556666777788889999aaaabbbbccccddddeeeeffff0011223344556677 4 5# math.ceil(math.log(x+1,2**32))*32でxを表現するのに必要なビット数を32単位で計算 6# 0x00001111が512ビット値の上位32bitに来るように左シフトする 7x_tmp = (x << (512 - math.ceil(math.log(x+1,2**32))*32)) 8 9# 上位から32bit単位でデータ取得 10W = [ (x_tmp >> shift) & 0xffffffff for shift in range(512-32, -32, -32) ] 11 12print(len(W)) 13""" 1416 15""" 16 17print(W) 18""" 19[4369, 572666675, 1145328981, 1717991287, 2290653593, 2863315899, 3435978205, 4008640511, 1122867, 1146447479, 0, 0, 0, 0, 0, 0] 20""" 21print( [ format(_, '08x') for _ in W ]) 22""" 23['00001111', '22223333', '44445555', '66667777', '88889999', 'aaaabbbb', 'ccccdddd', 'eeeeffff', '00112233', '44556677', '00000000', '00000000', '00000000', '00000000', '00000000', '00000000'] 24""" 25

※python 3.7.4で確認

投稿2019/10/26 07:37

nomuken

総合スコア1627

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問