Esempio n. 1
0
string MD5::encryptionWithMD5(string srcString)
{
    //每次开始之前都需要将state和count状态“清零”
    count[0] = count[1] = 0;
	state[0] = 0x67452301;
	state[1] = 0xefcdab89;
	state[2] = 0x98badcfe;
	state[3] = 0x10325476;
    
    appending((const uint8_t*)srcString.c_str(), srcString.length());
    
    
    uint8_t bits[8];
	uint32_t index, padLen;
    
    //以bit的形式记录字符串长度,用以append到最后
	encode(count, bits, 8);
    
    //先append 0b10000000的padding
    index = (uint32_t)((count[0] / 8) & 0x3f);
	padLen = (index < 56) ? (56 - index) : (120 - index);
	appending(PADDING, padLen);
    
    //再append比特流长度bits
	appending(bits, 8);
    
    //把结果由word转换成byte
	encode(state, result, 16);
    
    
    //最后把两个char转换成可读的表示十六进制的string
    uint8_t *byteResult = result;
    string str;
    str.reserve(16 << 1);
	for (size_t i = 0; i < 16; ++i) {
		int t = byteResult[i];
		int a = t / 16; //a表示十位数
		int b = t % 16; //b表示个位数
		str.append(1, HEX[a]);
		str.append(1, HEX[b]);
	}
	return str;
}
/*
 * Rewrap the given section of string, putting the result in aOutString.
 */
nsresult
nsWrapUtils::Rewrap(const nsAString& aInString,
                         PRUint32 aWrapCol, PRUint32 aFirstLineOffset,
                         PRBool aRespectNewlines,
                         const nsAString &aLineStartStr,
                         nsAString& aOutString)
{
  PRInt32 i;

  nsresult rv;
  nsCOMPtr<nsILineBreaker> lineBreaker = do_GetService(NS_LBRK_CONTRACTID, &rv);

  aOutString.Truncate();

  // Now we either have a line breaker, or we don't.
  const nsPromiseFlatString &tString = PromiseFlatString(aInString);
  PRInt32 length = tString.Length();
  const PRUnichar* unicodeStr = tString.get();
  for (i = 0; i < length; )    // loop over lines
  {
    nsAutoString remaining(unicodeStr + i, length - i);

    // If there's a first-line offset, that means we're not starting
    // at the beginning of the line, so don't add a cite string there:
    if (!aFirstLineOffset)
      aOutString.Append(aLineStartStr);

    PRInt32 eol = i + aWrapCol - aFirstLineOffset;
    if (eol > length)
    {
      aOutString.Append(unicodeStr + i, length - i);
      aOutString.Append(PRUnichar('\n'));  // DOM line breaks, not NS_LINEBREAK
      break;
    }
    if (i > 0) aFirstLineOffset = 0;
    // eol is the prospective end of line ...
    // look backwards from there for a place to break.
    PRInt32 breakPt;
    rv = NS_ERROR_BASE;
    if (lineBreaker)
    {
      breakPt = lineBreaker->Prev(unicodeStr + i, length - i, eol - i);
      if (breakPt == NS_LINEBREAKER_NEED_MORE_TEXT)
      {
        breakPt = lineBreaker->Next(unicodeStr + i, length - i, eol - i);
        if (breakPt == NS_LINEBREAKER_NEED_MORE_TEXT) rv = NS_ERROR_BASE;
        else rv = NS_OK;
      }
      else rv = NS_OK;
    }
    // If we get out here and rv is set, something went wrong with line breaker.
    // Just break the line, hard.
    // If rv is okay, then breakPt is the place to break.
    if (NS_FAILED(rv))
    {
#ifdef DEBUG_akkana
      printf("nsILineBreaker not working -- breaking hard\n");
#endif
      breakPt = eol+1;
    }
    else breakPt += i;
    nsAutoString appending(unicodeStr + i, breakPt - i);
    aOutString.Append(unicodeStr + i, breakPt - i);
    aOutString.Append(PRUnichar('\n'));  // DOM line breaks, not NS_LINEBREAK

    i = breakPt;
  } // continue looping over lines

  return NS_OK;
}