2009-11-20 29 views
7

Đây là một vấn đề kỳ lạ đã khiến tôi băn khoăn một chút.In ra các giá trị hex của một mảng char * trong C cho các giá trị lẻ cho đầu vào nhị phân

Chương trình được viết bằng C89 và nó đọc một tệp thành một mảng char * 16 byte tại một thời điểm (sử dụng fread và kích thước sizeof (char)). Tập tin là fopen'd với cờ "rb". Mảng này sau đó được chuyển vào một hàm về cơ bản lấy 16 giá trị hex và đưa nó vào một chuỗi, mỗi giá trị được phân cách bởi một khoảng trắng.

Đây là nơi mà sự kỳ quặc xuất hiện. Hàm này tạo ra một kết xuất hex đẹp, 16 byte tại một thời điểm, cho đầu vào tệp văn bản mà tôi có. Nhưng nó vít lên nếu tôi thử nó trên một hình ảnh bitmap nhỏ - tôi kết thúc với đầu ra trong chuỗi như ffffff88 thay vì chỉ 88.

Giá trị hex được đặt vào chuỗi đầu ra bằng cách sử dụng sprintf ("% 02x" , nhập [i]); trong một vòng lặp.

Tại sao tính năng này hoạt động bình thường đối với một số tệp nhưng không hoạt động với một số tệp khác?

Trả lời

9

Những gì bạn thấy là kết quả của phần mở rộng dấu hiệu từ char để int, sử dụng unsigned char * hoặc đúc để unsigned char trước khi các diễn viên để int là (ngầm?) Thực hiện nên khắc phục vấn đề của bạn.

11

Trong C, char được coi là giá trị đã ký, trừ khi bạn chỉ định nó là chưa ký. Có vẻ như khi bạn chuyển các tham số cho một hàm, khi tham số xảy ra là một char, nó 'đệm' thành kích thước của một số nguyên thông thường. Nếu bạn không đầu mối trình biên dịch trong đó điều này nên được thực hiện một cách unsigned, 128 trở thành 0xFFFFFF80, và như vậy.

Vì vậy, tiện ích mở rộng dấu hiệu xảy ra trước khi trình định dạng in bao giờ xem xét giá trị. Điều này có nghĩa là

printf("%02X", (unsigned) input[i]); 

sẽ không giải quyết được vấn đề của bạn, như giá trị của đầu vào [i] sẽ được biển báo mở rộng, vì vậy tất cả các giá trị 128-255 được coi là -127 -1 và trở thành 0xFFFFFF80 đến 0xFFFFFF, sau đó truyền, trong khi

printf("%02X", ((unsigned char *) input)[i]); 

sẽ thực hiện thủ thuật, nhưng rất khó đọc và khó đọc. Tốt nhất để làm cho kiểu đầu vào [] được unsigned char ngay từ đầu.

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