2010-04-29 48 views
5

MASSIVE EDIT:C - Chuyển đổi int dài chuỗi hex ký

Tôi có một lâu int biến mà tôi cần phải chuyển đổi thành một chuỗi 24bit thập lục phân có mà không có sự "0x" lúc bắt đầu. Chuỗi phải có 6 ký tự, theo sau là một chuỗi ký tự '\ 0', vì vậy các số 0 đứng đầu cần phải được thêm vào.

Ví dụ: [-1 -> FFFFFF] --- [1 -> 000001] --- [71 -> 000.047]

trả lời Điều này dường như làm các trick:

long int number = 37; 
char string[7]; 

snprintf (string, 7, "%lX", number); 
+0

Chỉ để làm rõ, ý bạn là gì bằng hex đã ký, ví dụ: những gì nên -1 được chuyển thành? –

+0

FFFFFF (nếu tôi đã thực hiện quyền chuyển đổi của mình: s) – Cheetah

+0

OK, có vẻ như chuyển đổi thành unsigned long và in một số hex chưa ký. –

Trả lời

8

Vì bạn chỉ muốn sáu chữ số, có thể bạn sẽ phải làm một số mặt nạ để đảm bảo rằng số đó là như bạn yêu cầu. Một cái gì đó như thế này:

sprintf(buffer, "%06lx", (unsigned long)val & 0xFFFFFFUL); 

Lưu ý rằng bạn đang ánh xạ tất cả các số nguyên dài vào một phạm vi biểu diễn nhỏ. Bạn có thể muốn kiểm tra số trong một phạm vi cụ thể trước khi in nó (Ví dụ -2^23 < x < 2^23 - 1)

+1

Đây là câu trả lời * hoàn chỉnh * duy nhất ngay bây giờ (yêu cầu chuyển đổi thành 'unsigned long'). – caf

+0

Điều gì xác định bạn ánh xạ cái gì? Giả sử tôi theo sau 32 bit (chuỗi ký tự 8), bạn sẽ thêm bản đồ nào sau đó?(Rõ ràng là bạn cũng thay đổi cờ định dạng thành 08) – Cheetah

+0

Hiệu quả, ánh xạ là x -> x (mod 2^24), vì vậy số> 2^24 quấn quanh. Với tám ký tự, chuỗi 32 bit, nó sẽ là x -> x (mod 2^32) cho dù đây là một tiêm (đảo ngược) phụ thuộc vào cách lớn unsigned dài là trên nền tảng trong câu hỏi. –

1

Sử dụng itoa. Nó lấy căn cứ mong muốn làm đối số.

Hoặc suy nghĩ thứ hai, không. Sử dụng sprintf, tuân thủ tiêu chuẩn.

11

Nhìn vào sprintf. Trình chỉ định %lx làm những gì bạn muốn.

+2

Hơn nữa, bạn nên sử dụng 'snprintf' thay vì' sprintf' nếu bạn có thể. – dreamlax

1

Trong tiêu đề bạn nói bạn muốn có chuỗi ký tự hex, nhưng tất cả các ví dụ của bạn là chuỗi ký tự không dấu. Giả sử các ví dụ là những gì bạn muốn, cách dễ nhất là

sprintf(buffer, "%06X", (int)value & 0xffffff); 
Các vấn đề liên quan