首页 > 其他分享 >字节流与十六进制字符串的相互转化

字节流与十六进制字符串的相互转化

时间:2024-05-20 11:40:37浏览次数:23  
标签:std 十六进制 字节 length result && 字符串 digest size

using Digest = std::vector<unsigned char>;

std::string digestToHex(const Digest& bytes, std::size_t length)
{
	static const char digits[] = "0123456789abcdef";
	const std::size_t fullLen = bytes.size()*2;
	std::size_t len = length ? length*2 : fullLen;
	if (len > fullLen)
		throw Poco::InvalidArgumentException(
			Poco::format("DigestEngine::digestToHex(): invalid length : %z,"
				"max alllowed is %z", length, fullLen));
	std::string result;
	result.reserve(len);
	for (auto b: bytes)
	{
		result += digits[(b >> 4) & 0xF];
		result += digits[b & 0xF];
		if (result.size() >= len) break;
	}
	return result;
}


Digest digestFromHex(const std::string& digest)
{
	if (digest.size() % 2 != 0)
		throw DataFormatException();
	Digest result;
	result.reserve(digest.size() / 2);
	for (std::size_t i = 0; i < digest.size(); ++i)
	{
		int c = 0;
		// first upper 4 bits
		if (digest[i] >= '0' && digest[i] <= '9')
			c = digest[i] - '0';
		else if (digest[i] >= 'a' && digest[i] <= 'f')
			c = digest[i] - 'a' + 10;
		else if (digest[i] >= 'A' && digest[i] <= 'F')
			c = digest[i] - 'A' + 10;
		else
			throw DataFormatException();
		c <<= 4;
		++i;
		if (digest[i] >= '0' && digest[i] <= '9')
			c += digest[i] - '0';
		else if (digest[i] >= 'a' && digest[i] <= 'f')
			c += digest[i] - 'a' + 10;
		else if (digest[i] >= 'A' && digest[i] <= 'F')
			c += digest[i] - 'A' + 10;
		else
			throw DataFormatException();

		result.push_back(static_cast<unsigned char>(c));
	}
	return result;
}

标签:std,十六进制,字节,length,result,&&,字符串,digest,size
From: https://www.cnblogs.com/sunwenqi/p/18201554

相关文章

  • PTA——字符串答案
    7-1sdut-C语言实验-字符编码请将一串长度最长为5的纯字母文本译成一个密码,密码规律如下:用原来的字母后面的第4个字母代替原来的字母。如C用G代替(如果该字母没后面没有第4个字母可代替,则需从26字母表中的首字母开始代替,比如:W用A代替,Z用D代替),最后得到的文本即为密码。输入格式:......
  • Vue3+nanoid编写字符串ID生成器
    Vue3+nanoid编写字符串ID生成器中文介绍:https://github.com/ai/nanoid/blob/HEAD/README.zh-CN.md一个小巧、安全、URL友好、唯一的JavaScript字符串ID生成器。“一个惊人的无意义的完美主义水平,这简直让人无法不敬佩。”小巧. 116字节(经过压缩和Brotli处理)。没有依......
  • 2024-05-18:用go语言,给定一个从 0 开始的字符串 s,以及两个子字符串 a 和 b,还有一个整数
    2024-05-18:用go语言,给定一个从0开始的字符串s,以及两个子字符串a和b,还有一个整数k。定义一个“美丽下标”,当满足以下条件时:1.找到字符串a在字符串s中的位置,且该位置范围为0<=i<=s.length-a.length。2.找到字符串b在字符串s中的位置,且该位置范围为0<=j......
  • 代码随想录算法训练营第十一天 | 20.有效的括号 1047.删除字符串中的所有相邻 重复项
    20.有效的括号题目链接文章讲解视频讲解思路:遍历字符串,如果栈不为空,则进行匹配   如果匹配则出栈,否则入栈   如果栈为空,直接入栈   遍历结束后栈为空则说明全部匹配,否则没有全部匹配classSolution{public:boolisValid(strings){stack<cha......
  • 提取字符串中间的字母数字
    问题:字符串包含汉字、字母、数字、符号等,需要提取汉字后连续9个字母数字符号函数公式解决:老套路: =LEFT(MIDB(A2,SEARCHB("?",A2),99),9)WPS专用新套路: =@REGEXP(A2,"[--Z]+")老套路:SearchB:查找第一个单字节字符的位置MidB:中取汉字后所有字符串Left:左取指定的9个字符串......
  • 代码随想录算法训练营第第11天 | 20. 有效的括号 、1047. 删除字符串中的所有相邻重
    今天的题主要是关于栈的,比较简单,一次性过20.有效的括号讲完了栈实现队列,队列实现栈,接下来就是栈的经典应用了。大家先自己思考一下有哪些不匹配的场景,在看视频我讲的都有哪些场景,落实到代码其实就容易很多了。题目链接/文章讲解/视频讲解:https://programmercarl.com/0020.......
  • 有关字符串的函数接口
    目录strstr函数,用于从一个字符串中查找子串strtok函数,用于分割字符串strstr函数,用于从一个字符串中查找子串strtok函数,用于分割字符串......
  • 字节面试:MySQL什么时候 锁表?如何防止锁表?
    文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面试必备+大厂必备+涨薪必备免费赠送:《尼恩技术圣经+高并发系列PDF》,帮你实现技术自由,完成职业升级,薪......
  • 代码随想录算法训练营第第九天 | 28. 实现 strStr() 、459.重复的子字符串
    实现strStr()因为KMP算法很难,大家别奢求一次就把kmp全理解了,大家刚学KMP一定会有各种各样的疑问,先留着,别期望立刻啃明白,第一遍了解大概思路,二刷的时候,再看KMP会好懂很多。或者说大家可以放弃一刷可以不看KMP,今天来回顾一下之前的算法题目就可以。因为大家算法能力还没到,......
  • 我发现了字节OpenApi接口的bug!
    本文记录我在对接字节旗下产品火山云旗下云游戏产品OpenApi接口文档时遇到的坑,希望能帮助大家(火山云旗下云游戏产品的文档坑很多,我算是从零到一都踩了一遍,特此记录,希望大家引以为鉴)。1.文档问题很经典的开局一张图,对接全靠问,这里给大家强调下,当要跟第三方产品对接时,一定要......