Loại unsinged char
thường được sử dụng làm đại diện cho một dữ liệu nhị phân đơn lẻ byte
. Vì vậy, và mảng thường được sử dụng như một bộ đệm dữ liệu nhị phân, trong đó mỗi phần tử là một byte đơn.
Cấu trúc unsigned char*
sẽ là con trỏ tới bộ đệm dữ liệu nhị phân (hoặc phần tử thứ nhất của nó).
Tôi không chắc chắn 100% những gì hiện c++
tiêu chuẩn chính xác nói về kích thước của unsigned char
, cho dù đó là cố định là 8 bit hay không. Thường là. Tôi sẽ cố gắng tìm và đăng nó.
Sau khi nhìn thấy mã của bạn
Khi bạn sử dụng một cái gì đó giống như void* input
như một tham số của một hàm, bạn cố tình dải xuống thông tin về nguyên liệu đầu vào loại gốc. Đây là gợi ý rất mạnh mẽ rằng đầu vào sẽ được xử lý theo cách rất chung chung. I E. như một chuỗi byte tùy ý. Mặt khác, int* input
sẽ gợi ý rằng nó sẽ được coi là "chuỗi" của các số nguyên được chọn.
void*
chủ yếu được sử dụng trong trường hợp khi đầu vào được mã hóa, hoặc xử lý bit
/byte
khôn ngoan vì lý do gì, vì bạn không thể rút ra kết luận về nội dung của nó.
Sau đó, trong chức năng của bạn, bạn dường như muốn coi đầu vào là một chuỗi các byte. Nhưng để hoạt động trên các đối tượng, ví dụ: thực hiện operator=
(bài tập) trình biên dịch cần phải biết phải làm gì. Vì bạn khai báo đầu vào là việc gán void*
chẳng hạn như *input = something
sẽ không có ý nghĩa vì *input
là loại void
. Để làm cho trình biên dịch xử lý các phần tử input
là "các mẩu bộ nhớ thô nhỏ nhất", bạn hãy đưa nó vào loại thích hợp là unsigned int
.
cout
có thể không hoạt động do chuyển đổi loại sai hoặc không mong muốn. char*
được coi là một chuỗi chấm dứt null và rất dễ nhầm lẫn mã số phiên bản singed
và unsigned
. Nếu bạn vượt qua unsinged char*
đến ostream::operator<<
dưới dạng char*
, nó sẽ xử lý và mong đợi đầu vào byte
làm ký tự ASCII bình thường, trong đó 0
có nghĩa là kết thúc chuỗi không phải là giá trị số nguyên 0
. Khi bạn muốn in nội dung của bộ nhớ, tốt nhất là nên sử dụng con trỏ một cách rõ ràng.
Cũng lưu ý rằng để in nội dung bộ nhớ của bộ đệm, bạn sẽ cần phải sử dụng vòng lặp, vì chức năng in ấn khôn ngoan khác sẽ không biết khi nào nên dừng.
khi chuyển đổi thành con trỏ ký tự, byte đầu tiên có thể là số không giống với ký tự kết thúc chuỗi và do đó sẽ không có nội dung nào được in. Nó sẽ giúp ích nhiều hơn nếu bạn có thể hiển thị những gì bạn thực sự làm, tức là đăng một số mã. Vui lòng tạo [SSCCE] (http://sscce.org/) và thêm vào câu hỏi. –
Nhưng tôi nghĩ rằng sẽ mất thông tin nếu byte đầu tiên là số không và thực sự tôi đang cố gắng để in tất cả bốn byte nhưng nó không in bất cứ điều gì. –
Câu hỏi của bạn có vẻ nhiều hơn về "tại sao" thay vì "khi". Rất thường xuyên, 'unsigned char *' được sử dụng như một phương thức truy cập mức byte để tiếp cận vào một biến hoặc địa chỉ bộ nhớ của một kiểu không chính thức hơn. Nó có nhiều niceties, trong số đó, miễn dịch với các quy tắc bí mật nghiêm ngặt và sự liên kết được đảm bảo tiêu chuẩn với bất kỳ địa chỉ nào bạn ném vào nó. Mới với C + + không nên làm cho điều này khó khăn nếu bạn đang hợp lý quen thuộc với C. Mới để * lập trình *, tôi thấy điều này như là một thách thức để hiểu. Có lẽ bạn có một số mã và ý tưởng đằng sau nó bạn có câu hỏi về? – WhozCraig