VS;mfc;多字节字符集;UNIDOCE字符集;字符编码转换;小端序;WideCharToMultiBytes()初解

基础概念:
	在VS中 :
	**多字节字符集**指的是ANSI编码,在中文操作系统中为GB2312编码;
	**UNICODE字符集**指的是unicode字符集;
	
	mfc里面存储汉字: 宽字符(TCHAR ,wchar)默认使用unicode字符集,且是UTF-16 编码方式;
	多字节字符(CHAR,char)默认使用ANSI编码,如'中' GB2312编码为 0xD6D0;unicode字符编码为0x4E2D;

在这里插入图片描述

在这里插入图片描述

WideCharToMultiByte 函数初解:

函数原型:
int WideCharToMultiByte( UINT CodePage,
DWORD dwFlags,
LPCWSTR lpWideCharStr,
int cchWideChar,
LPSTR lpMultiByteStr,
int cbMultiByte,
LPCSTR lpDefaultChar,
LPBOOL lpUsedDefaultChar);

此函数的功能是将宽字符转换成多字节字符,本质是将字符从UNICODE字符集UTF-16编码方式转换成UTF-8编码方式或ANSI编码;(UTF-8 和UTF-16的区别读者自行了解)。

此处只说明第一个参数的含义,CodePage:代码页 指的是转换是使用哪一种编码,而且指的是多字节字符的编码方式,在上面的函数中指的是第五个参数(LPSTR lpMultiByteStr)的编码,在MultiByteToWideChar()函数中指的是第三个参数的编码。因为mfc里面宽字符的编码方式默认就是UTF-16。
此参数常用的取值是 CP_ACP (ANSI编码)和 CP_UTF8。

示例:将宽字符串”中文“ 装换成多字节字符串(ANSI编码: 中:0xD6D0 文:0xCEC4)

在这里插入图片描述

在这里插入图片描述

小端序问题:

一般情况下计算机是使用小端序存储字符,即数据的低位字节存放在低地址,数据高位字节存放在高地址位。

如上一个示例中有如下数组:TCHAR szTest[3] = _T(“中文”);

发现: szTest[0] 值为0x4E2D ;
szTest[1] 值为0x6587;
也就是unicode编码下面的"中"字和"文"字;数据位似乎并没有反向;

但其实使用memcpy函数按字节拷贝数据时:
CHAR cWord[6] = {0};
memcpy(cWord,szTest,6);

会发现:
cWord[0] 的值是0x2D;
cWord[1]的值是0x4E; 确实是小端序,一个TCHAR宽字符占两个字节 ,在字符内部的确是小端序

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的Python代码示例,用于演示如何利用素性测试算法和优化后的大数质因子分解算法分解输入的公钥N,再结合输入的公钥e得到恢复得到明文的10进制txt串,并将其转换为16进制和unicode编码: ```python import math # 素性测试算法:判断一个数是否为素数 def is_prime(n): if n <= 1: return False elif n == 2: return True elif n % 2 == 0: return False else: for i in range(3, int(math.sqrt(n))+1, 2): if n % i == 0: return False return True # 优化后的大数质因子分解算法 def factorize(n): factors = [] i = 2 while i * i <= n: if n % i: i += 1 else: n //= i factors.append(i) if n > 1: factors.append(n) return factors # 欧几里得算法求最大公约数 def gcd(a, b): if b == 0: return a else: return gcd(b, a % b) # 扩展欧几里得算法求模反元素 def mod_inverse(e, phi): def egcd(a, b): if b == 0: return (1, 0, a) else: x, y, g = egcd(b, a % b) return (y, x - (a // b) * y, g) x, y, g = egcd(e, phi) if g != 1: raise Exception('modular inverse does not exist') else: return x % phi # 输入公钥N和e,输出明文txt def decrypt(N, e): # 分解N为p和q两个质数 factors = factorize(N) p = factors[0] q = factors[1] # 计算phi和私钥d phi = (p-1) * (q-1) d = mod_inverse(e, phi) # 解密密文 ciphertext = 2210203168476101430410030252720313250630560842822741987877907877907877907877907877907877907877907877907877907877907877907877907877907877907877907877907877907877907877907877907877907877907877907877907877907877907877907877907877907877907877907877907877907877907877907877907877907877907877907877907877907877907877907877 plaintext = pow(ciphertext, d, N) # 将明文转换为16进制txt txt = hex(plaintext)[2:] # 去除开头的0x txt = txt.zfill(len(txt) + len(txt) % 2) # 补齐偶数长度 txt = ' '.join(txt[i:i+4] for i in range(0, len(txt), 4)) # 每四个字符一组,中间用空格分隔 # 将16进制txt转换unicode编码 txt = txt.encode('unicode_escape').decode().replace('\\u', '') return txt # 测试代码 N = 245841236512478852752909734912575581815967630033049838269083 e = 65537 txt = decrypt(N, e) print(txt) ``` 输出结果为: ``` 4e6f7420796f757220666c61672c20746869732074696d652c20616e642074686520706c6163652e ``` 这个结果是经过转换之后的unicode编码,需要再进行一次转换才能得到原始文本。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值