需要將數組從unsigned char *安全地轉換爲char *。 我這樣做。它是否正確?將數組從unsigned char *轉換爲char *
std::vector < unsigned char > arr;
char *imgData = (char*) malloc(arr.size());
for (int i = 0; i < arr.size(); i++) imgData[ i ] = (arr.at(i) - 128);
需要將數組從unsigned char *安全地轉換爲char *。 我這樣做。它是否正確?將數組從unsigned char *轉換爲char *
std::vector < unsigned char > arr;
char *imgData = (char*) malloc(arr.size());
for (int i = 0; i < arr.size(); i++) imgData[ i ] = (arr.at(i) - 128);
不,這是不安全的。或者更重要的是,它在C++中不是定義明確的行爲。
char
允許簽名或簽名,但是實現認爲合適。如果char
是無符號的,則從unsigned char
減去128將會截斷一半的位。如果char
已簽名,則不能保證它是二進制補碼,因此減去128將不會達到您想要的值。
那種你正在試圖做的轉換是不合理的。您將變量命名爲imgData
,因此您似乎打算將該數據發送給某個圖像API。並且該API需要經常使用char
。所以你的目標似乎是將每個unsigned char
轉換爲char
,它們共享原始unsigned char
的完全相同的位模式。
在這種情況下...只是轉換指針:static_cast<char*>(arr.data())
。你會以任何方式挑起未定義的行爲;我寧願這樣做可能實際上工作;)
此外,應該指出,C++ 14使其實際上不可能實現char
的簽名版本,不使用二進制補碼。這是因爲需要通過可能簽名的char
類型來支持UTF-8。您必須能夠將char*
轉換爲unsigned char*
並返回,以便保留所有有效UTF-8代碼單元的位模式。
所以劇組仍然是最有可能做的其實你想要的選項。
「安全轉換」是什麼意思? – ixSci