2011-02-08 16 views
0

我需要幫助從一些之一的從紅寶石以下代碼行轉換成QT C++:我不得不從紅寶石一行轉換爲Qt的C++

KEY =%(重量)(30 81 9F 30 0D 06 09 2A 86 48 86 F7 0D 01 01 01 05 00 03 81 8D 00).map {| s | ('C *')

+0

你知道Ruby或Qt的C++?你有什麼麻煩? – Phrogz 2011-02-08 21:21:24

+0

我比紅寶石更瞭解qt C++。但我不知道如何做這部分=>使用Array#pack將數組轉換爲無符號8位整數的二進制字符串。 – defiant 2011-02-09 10:15:26

回答

1
QByteArray key = QByteArray::fromHex(QByteArray("30 81 9F 30 0D 06 09 2A 86 48 86 F7 0D 01 01 01 05 00 03 81 8D 00").replace(' ', QString())); 

快速的解釋:

QByteArray("30 81 9F 30 0D 06 09 2A 86 48 86 F7 0D 01 01 01 05 00 03 81 8D 00") 

創建臨時的QByteArray與密鑰字符串

.replace(' ', QString()) 

刪除臨時QByteArray中的所有空間,所以它僅包含字符0..F

QByteArray::fromHex() 

將十六進制編碼的QByteArray轉換爲包含無符號8位整數的QByteArray(即, C++字符類型)。這意味着它需要從原始QByteArray(例如「41」)每對十六進制數字並將其轉換爲整數(「41」將轉換爲65 = 4 * 16 + 1)並將此值附加到新的QByteArray中。

如果你需要key作爲「const char *」,你可以使用QByteArray :: constData()方法,但是你必須記住,只有當原QByteArray有效時,這個方法返回的指針纔有效來自文檔:「只要字節數組不重新分配或銷燬」)。因此,如果您需要存儲關鍵數據,請將其保存爲QByteArray或複製由constData()返回的const char *。

1
char KEY[] = { 
    48, 129, 159, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 129, 141, 0 
}; 

結果稍微有些不同,一個平面的字節值數組。當然可以使用來創建1個字符的字符串對象引用數組,但它不可能有用。

+0

你能解釋一下你是什麼意思**當然可以做一個1字符串對象引用的數組,但它不可能是有用的。** – defiant 2011-02-09 10:16:29

+0

我相信原作者也會需要知道如何將其轉換爲QByteArray(非平凡)。 – 2011-02-09 14:05:41

+0

它只需要是一個QByteArray,如果它需要使用QByteArray的功能,這些功能在普通的舊C數組中不可用。在這種情況下,QByteArray有一個構造函數,它帶有一個char *和一個大小。 – Ferruccio 2011-02-09 21:16:21

2

這裏的Ruby代碼做什麼:

  1. 創建一個字符串數組,["30", "81", "9F", ... "8D", "00" ]
  2. 陣列中的每一個轉換十六進制字符串到整數:[48, 129, 159, ... 141, 0]
  3. 使用Array#pack打開陣列分爲無符號的8位整數的一個單一的二進制字符串。
2

如果一個簡單的C數組會做:

unsigned char KEY[22] = { 0x30, 0x81, 0x9F, 0x30, 0x0D, 0x06... }; 

如果你需要的QByteArray:

QByteArray KEY("\x30\x81\x9F\x30\x0D\x06...", 22);