首页新闻找找看学习计划

关于中文字符串utf-8转为byte切割后转字符串乱码问题

0
悬赏园豆:30 [已解决问题] 解决于 2014-12-02 14:19

有一段中文我用 Encoding.UTF-8.GetBytes( 中文)转为byte数组,然后切割一段900字节左右的转为字符串。怎么才能不乱码?

备注:utf-8不像gb2312中文是固定2字节。

路飞的小蝴蝶的主页 路飞的小蝴蝶 | 初学一级 | 园豆:46
提问于:2014-11-28 10:15
< >
分享
最佳答案
1

为什么要切割 900 字节?

收获园豆:30
Launcher | 高人七级 |园豆:45040 | 2014-11-28 10:18

900左右但不能超过1024 加密机加密不了

路飞的小蝴蝶 | 园豆:46 (初学一级) | 2014-11-28 10:19

@路飞的小蝴蝶: 你的最终目的是想把超过 1024 字节的数据分段加密,还是只需要加密前 1024 字节数据就可以了?

Launcher | 园豆:45040 (高人七级) | 2014-11-28 11:17

@Launcher: 人家给我的接口是要传中文的。要是传字节就好办了。所以我得算好长度不能超过1024字节的字符串,还得算好切割时不乱码

路飞的小蝴蝶 | 园豆:46 (初学一级) | 2014-11-28 11:20

@路飞的小蝴蝶: 传中文是什么意思?是在人家的加密实现中需要实时的显示或者写入中文字符吗?

Launcher | 园豆:45040 (高人七级) | 2014-11-28 11:49

@Launcher: 别人提供的调用加密机指令的类库。传入的是字符串,而且要求不超过1024 utf-8转字节码后的字节数。想不到好办法呀

路飞的小蝴蝶 | 园豆:46 (初学一级) | 2014-12-01 14:19

@路飞的小蝴蝶: 你把别人的 api 的接口贴出来我看看。

Launcher | 园豆:45040 (高人七级) | 2014-12-01 16:04

@Launcher: 

public string EncMsg(string Msg, string Key, out string EncMsg)
{
int iResult;
EncMsg = "";
StringBuilder sbEncMsg = new StringBuilder();
byte[] ret = new byte[3];
byte[] curMsg;
int processedLen = 0;
byte[] msg = Encoding.UTF8.GetBytes(Msg);

int HLen = msg.Length + 4;
byte[] msgBytes = new byte[HLen];
msgBytes.SetValues(msg.Length.ToString("D08").ToHex(), 0, 4);
msgBytes.SetValues(msg, 4, msg.Length);
while (processedLen < HLen)
{
int curLen = HLen - processedLen;
if (curLen > 900)
curLen = 900;
ret = new byte[3];
EncMsg = "";
curMsg = new byte[curLen];
Buffer.BlockCopy(msgBytes, processedLen, curMsg, 0, curLen);
iResult = _hsmRal.HsmIstE0_("0".ToASCII(), "1".ToASCII(), "I".ToASCII(), "0".ToASCII(), Key.ToASCII(), 32, curLen, curMsg, ref EncMsg, ref ret);
if (ret.ToASC(0, 2) == "00")
{
sbEncMsg.Append(EncMsg);
}
else
{
return ret.ToASC(0, 2);
}
processedLen += 900;
}
EncMsg = sbEncMsg.ToString();
return ret.ToASC(0, 2);
}

路飞的小蝴蝶 | 园豆:46 (初学一级) | 2014-12-01 16:39

@路飞的小蝴蝶: 请问这个“public string EncMsg(string Msg, string Key, out string EncMsg)”是别人的,还是这个“_hsmRal.HsmIstE0_” 是别人的?

Launcher | 园豆:45040 (高人七级) | 2014-12-01 18:03

@Launcher:  _hsmRal.HsmIstE0_("0".ToASCII(), "1".ToASCII(), "I".ToASCII(), "0".ToASCII(), Key.ToASCII(), 32, curLen, curMsg, ref EncMsg, ref ret);别人的,但是我送给他的时候必须要是不乱吗的字节码。就是转为utf-8的字节码时不能把中文汉字拆分过来

路飞的小蝴蝶 | 园豆:46 (初学一级) | 2014-12-01 18:09

@路飞的小蝴蝶: 我注意到 HsmIstE0_ 方法中的两个参数:curLen, curMsg,对应的 C/C++ 定义为:

int len,const char * pMsg,其含义是对从 pMsg 开始的 len 个字节加密,这里指定了长度,因此与字符串编码无关。所以,你能讲清楚,为什么它必须要把 pMsg 表达成一个有效的字符串吗?

Launcher | 园豆:45040 (高人七级) | 2014-12-02 09:27

@Launcher: 因为人家解密的时候也要分包解密,调用底层密文进去出来的是16进制的字符串,在转为中文的时候我担心有问题。

路飞的小蝴蝶 | 园豆:46 (初学一级) | 2014-12-02 10:20

@路飞的小蝴蝶: 我假设要加密的中文字符串是“路飞”,按照 UTF-8 转换成字节数组是 {0x20,0x33,0x40,0x56},现在我将此字节数组分成两部分加密,先将 {0x20} 加密(这明显不是一个完整的中文字)后得到的密文字节数组是:{0x22,0x45,0x66},然后将{0x33,0x40,0x56}加密后的到密文字节数组是:{0x11,0x47,0x68}。

现在我们来看解密操作:

将密文{0x22,0x45,0x66}解密后,是不是能得到明文{0x20}?

将密文{0x11,0x47,0x68}解密后,是不是能得到明文{0x33,0x40,0x56}?

然后我们把两次解密的结果组合起来{0x20} + {0x33,0x40,0x56},是不是就得到了最初的明文{0x20,0x33,0x40,0x56}?现在在将此字节数组按照 UTF-8 编码成字符串,是不是就能得到明文“路飞”?

那么请问,从上面的加解密流程中,你是如何看出加解算法跟编码有关联的?

 

 

Launcher | 园豆:45040 (高人七级) | 2014-12-02 12:58

@Launcher: 明白了,谢谢你!解密解不了是其他的原因。

路飞的小蝴蝶 | 园豆:46 (初学一级) | 2014-12-02 14:18
其他回答(1)
0

先把你的“中文”切割成N个小段,再把这些小段用Encoding.UTF-8.GetBytes呀,得出来的不就可以加密了??????

XiaoFaye | 园豆:3082 (老鸟四级) | 2014-11-28 10:21
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册