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; }