Edit: Bây giờ tương thích với MSVC, C++ và phi GNU (xem cuối).
Câu hỏi là "cách hiệu quả nhất". OP không chỉ định nền tảng, anh ta có thể biên dịch cho chip ATMEL dựa trên RISC với 256 byte bộ nhớ flash cho mã của mình.
Đối với hồ sơ, và cho những người (như tôi), những người đánh giá cao sự khác biệt giữa "Cách đơn giản nhất" và "Cách hiệu quả nhất", và những người được hưởng học tập ...
static const long hextable[] = {
[0 ... 255] = -1, // bit aligned access into this table is considerably
['0'] = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, // faster for most modern processors,
['A'] = 10, 11, 12, 13, 14, 15, // for the space conscious, reduce to
['a'] = 10, 11, 12, 13, 14, 15 // signed char.
};
/**
* @brief convert a hexidecimal string to a signed long
* will not produce or process negative numbers except
* to signal error.
*
* @param hex without decoration, case insensitive.
*
* @return -1 on error, or result (max (sizeof(long)*8)-1 bits)
*/
long hexdec(unsigned const char *hex) {
long ret = 0;
while (*hex && ret >= 0) {
ret = (ret << 4) | hextable[*hex++];
}
return ret;
}
Nó đòi hỏi không có thư viện bên ngoài, và nó nên được nhanh chóng blindingly.Nó xử lý chữ hoa, chữ thường, ký tự không hợp lệ, đầu vào hex lẻ (ví dụ: 0xfff) và kích thước tối đa chỉ bị giới hạn bởi trình biên dịch.
Đối với trình biên dịch không phải GCC hoặc C++ hoặc trình biên dịch sẽ không chấp nhận khai báo hextable ưa thích.
Thay thế báo cáo kết quả đầu tiên với điều này (dài, nhưng phù hợp hơn) phiên bản:
static const long hextable[] = {
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1, 0,1,2,3,4,5,6,7,8,9,-1,-1,-1,-1,-1,-1,-1,10,11,12,13,14,15,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
};
Thật tuyệt vời. Tôi chưa từng thấy phương pháp này trước đây. –