2017-05-24 174 views
0

我有一個QString的1500 QChar,我想轉換爲uint32_t的數組。我正在讀取for循環中的每個元素,並試圖將各個QCharQString保存爲uint32_t數組。我可以通過data[i].unicode()將它轉換爲其等效表示(例如1→49),但我想要在uint32_t數組表單中進行進一步處理。QChar to uint32_t轉換/鑄造在Qt

QString data = {1,'A','C',9,8,.....}; 
uint32_t Test[data.length()] = {0}; 
for (uint32_t i =0; i<data.length(); i++) { 
    Test[i] = data[i]; // here i need QChar to uint32_t conversion 
} 

任何解決方案?

+0

對於這種轉換,「uint16_t」不是很合適的數據類型嗎?請注意,'QChar'代表16位。 – vahancho

+0

你想在uint32中保存什麼?作爲UTF8,UTF16或UTF32?另外,引用QT網站:「QChar類提供了一個16位的Unicode字符。」 – RvdK

+0

我想將它保存爲uint32_t。轉換後,我會將其傳遞給另一個函數,該函數僅接受uint32_t類型的數組。一個8個QChar的Qstring可以使用'data.toUInt(nullptr,16)'轉換爲uint32_t類型,但由於我有一個很長的字符串,我需要單獨執行每個單獨的項目。 – aly

回答

0

考慮到每個QChar只包含16位,並且由兩部分組成:單元格和行,您甚至可以將兩個QChar組合成單個uint32_t數字。我會做下列方式:

QString data("ABCDE"); 
std::vector<uint32_t> test((data.count() + 1)/2, 0); 

for (int i = 0; i < data.length(); ++i) 
{ 
    const QChar &c = data[i]; 
    uchar cell = c.cell(); 
    uchar row = c.row(); 

    uint32_t &ui32 = test[i/2]; 
    if (i % 2 == 0) 
    { 
     ui32 = cell; 
    } 
    else 
    { 
     ui32 <<= 8; 
     ui32 |= cell; 
    } 
    ui32 <<= 8; 
    ui32 |= row; 
} 

不過,如果你仍然需要有每QChar一個整數,你可以寫類似的循環,不喜歡壓縮:

QString data("ABCDE");  
std::vector<uint32_t> test(data.count(), 0); 

for (int i = 0; i < data.length(); ++i) 
{ 
    const QChar &c = data[i]; 
    uchar cell = c.cell(); 
    uchar row = c.row(); 

    uint32_t &ui32 = test[i]; 
    ui32 = cell; 
    ui32 <<= 8; 
    ui32 |= row; 
} 
0

我想在uint32_t Test[]數組中存儲QString數據項。例如。如果我有QString data = {1,'A','C',9,8,.....}作爲輸入而不是輸出,我想要有uint32_t Test = {1,'A','C',9,8,.....}

這並不複雜。每個QChar是一個圍繞uint16_t的薄包裝。所有你需要做的就是將這些轉換成uint32_t,你就完成了。

QVector<uint32_t> convert(const QString & str) { 
    QVector<uint32_t> output; 
    output.reserve(str.size()); 
    for (auto c : str) 
    output.append(c.unicode()); 
    return output; 
} 

void user(const uint32_t *, size_t size); 

void test(const QString & str) { 
    auto const data = convert(str); 
    user(data.data(), size_t(data.size()); 
} 

當然它可能是你對意義uint32_t錯誤的假設。上面的代碼假定user需要UTF16代碼單元。不過,更有可能的是,user需要UTF32代碼單元,即每個uint32_t只代表一個Unicode代碼點。

在後一種情況下,你要的UTF16代碼單位共軛對轉換爲單UTF32代碼單位:

QVector<uint32_t> convert(const QString & str) { 
    return str.toUcs4(); 
} 

注意,代碼點和代碼單元有特定的含義,是的代名詞。