概要
Pythonで「数値」と「16進数文字列」の相互変換。
マイナス値は、2の補数表現。
コード lambda
## 2の補数変換 lambda
bits = 8
all_one = (1<<bits) - 1
int2ss = lambda i: hex(i & all_one)
## int2ss = lambda i: hex(i & ((1<<bits) - 1))
sign_mask = (1<<(bits-1))
ss2int = lambda s: -(int(s,16) & sign_mask) | int(s,16)
## ss2int = lambda s: -(int(s,16) & (1<<(bits-1))) | int(s,16)
コード 関数版
## 2の補数変換 関数版
def int_to_signed_string(i, bits):
return hex(i & ((1<<bits) - 1))
def signed_string_to_int(s, bits):
ss = int(s,16)
return -(ss & (1<<(bits-1))) | ss
## テスト用
bits = 8
int2ss = lambda i: int_to_signed_string(i, bits)
ss2int = lambda s: signed_string_to_int(s, bits)
Test
test = [-128, -127, -2, -1, 0, 1, 2, 126, 127]
test_str_hex = []
for t in test:
print(f"{t}: {hex(t)}, {int2ss(t)}")
test_str_hex.append(int2ss(t))
print("---")
for t in test_str_hex:
print(f"{t}: {int(t, 16)}, {ss2int(t)}")
実行結果。
左が変換前、真ん中が2の補数を考慮しない場合、右が考慮した場合。
-128: -0x80, 0x80
-127: -0x7f, 0x81
-2: -0x2, 0xfe
-1: -0x1, 0xff
0: 0x0, 0x0
1: 0x1, 0x1
2: 0x2, 0x2
126: 0x7e, 0x7e
127: 0x7f, 0x7f
---
0x80: 128, -128
0x81: 129, -127
0xfe: 254, -2
0xff: 255, -1
0x0: 0, 0
0x1: 1, 1
0x2: 2, 2
0x7e: 126, 126
0x7f: 127, 127