2012-12-22 36 views
7

Input = 'FFFF' # 4 ASCIILàm thế nào tôi có thể chuyển đổi một chuỗi hex ASCII để một số nguyên ký

kết quả mong muốn của F ... -1 là một số nguyên

đang cố gắng:

hexstring = 'FFFF' 
result = (int(hexstring,16)) 
print result #65535 

Kết quả: 65535

Không có gì mà tôi đã thử dường như nhận ra rằng 'FFFF' là biểu thị của số âm.

+1

một cái gì đó như (Tôi không biết cú pháp) 'if (value> 0x7FFF) value - = 0x10000'? –

Trả lời

10

Python chuyển đổi FFFF tại 'mệnh giá', đến thập phân 65535

input = 'FFFF' 
val = int(input,16) # is 65535 

Bạn muốn nó hiểu là một số ký 16-bit. Đoạn code dưới đây sẽ có 16 bit thấp của bất kỳ số, và 'đăng mở rộng', tức là giải thích như một giá trị ký kết 16-bit và cung cấp những số nguyên tương ứng

val16 = ((val+0x8000)&0xFFFF) - 0x8000 

này có thể dễ dàng tổng quát

def sxtn(x, bits): 
    h= 1<<(bits-1) 
    m = (1<<bits)-1 
    return ((x+h) & m)-h 
+0

Và có, 'nếu val> = 0x8000: val - = 0x10000' cũng hoạt động tốt trong trường hợp đầu vào được biết là 0 .. 0xFFFF (từ Jan Dvorak). – greggo

2

Trong ngôn ngữ như C, 'FFFF' có thể được hiểu là giá trị đã ký (-1) hoặc chưa ký (65535). Bạn có thể sử dụng mô-đun struct của Python để buộc sự giải thích mà bạn muốn.

Lưu ý rằng có thể có vấn đề về cuối cùng mà mã bên dưới không cố gắng xử lý và không xử lý dữ liệu dài hơn 16 bit, vì vậy bạn cần điều chỉnh nếu một trong các trường hợp đó có hiệu lực cho bạn.

import struct 

input = 'FFFF' 

# first, convert to an integer. Python's going to treat it as an unsigned value. 
unsignedVal = int(input, 16) 
assert(65535 == unsignedVal) 
# pack that value into a format that the struct module can work with, as an 
# unsigned short integer 
packed = struct.pack('H', unsignedVal) 
assert('\xff\xff' == packed) 

# ..then UNpack it as a signed short integer 
signedVal = struct.unpack('h', packed)[0] 
assert(-1 == signedVal) 
+0

Sự kết thúc không phải là một vấn đề ở đây, vì các hoạt động h và H sẽ luôn có cùng tính xác thực. – greggo

+0

Ah, đúng vậy. +1 cho câu trả lời của bạn. – bgporter

Các vấn đề liên quan