char *轉換爲string的陷阱:char*中包含較多的'\0'

今天給團隊調試一個錯誤,概率性的加密的數據沒法做解密,現象是解密出來的結果和源數據長度不一致,很奇怪的現象,因爲加密使用的數據是隨機的,所以使得問題出現時表象是概率的問題;

因爲初次做加解密算法相關的項目,碰到這樣的問題,首先是單步把解密流程過了一遍,發現解密沒有問題,能正常的解密,但解密出來的長度就是不對,分析才發現加密後的數據的長度也不正常,所以考慮是加密源數據的問題,通過分析,才發現一個二進制的源數據經過轉換爲字符串對象string後使用openssl的接口完成的加密處理,導致string對象比原來的字節數組長度要短,短的原因是字節數組中包括了'\0'結束符,原以爲是openssl的接口實現存在這樣的問題,建議使用方將加密的字節數組將0字符都過濾一遍,但想來還是不正確,原來char*的數組轉換爲string存在一個陷阱:見“https://blog.csdn.net/b876144622/article/details/79972498”;所以還是轉換的不合適,修改前後的代碼如下:

  //原來的代碼
  #if 0
  char *temp = (char *)malloc(length + 1);
  if (temp == NULL){
    ALOGE("encrypt failed, temp == NULL");
    ShutdownOpenABE();
    return -1;
  }
  memcpy(temp, rawData, length);
  temp[length] = '\0'; 
  string inputStr = temp;
  FREE(temp);
  #else
  //修改的代碼
  string inputStr ;//= temp;
  //convert temp to string
  for (int i=0; i<length; i++){
  	if (i < length-1 && rawData[i] == '\0'){		
        cerr << "rawdata:" << rawData <<", length:" << length<<endl;
        //ALOGE("rawdata:%s, length:%d, i:%d", rawData, length, i);
		//return PARMETER_ERR_CONTENT;
	}
	inputStr += rawData[i];
  }
  #endif//end

參考:https://blog.csdn.net/analogous_love/article/details/71744427

還有一種方法是使用assign方法進行賦值,需要指定賦值字節數組的長度,否則以0做結束符計算長度;

inputStr .assign(rawData, length);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章