有朋友可能会说,直接Unicode.GetBytes,但是我最后要Socket发送的是gb2312啊。请大家帮帮忙
解决方案 »
- request.ServicePoint.Expect100Continue什么意思
- 点击事件后,怎么重新加载窗体?
- 入将dataset中的datatable导入到一张excel中?
- 想做一个类似NumericUpDown的控件???
- 关于gridview的HyperLink列
- SQL Server 不存在或访问被拒绝。想不明白,sqlserver已经打开,请高手指点!
- 如何在.NET中得到TextBox中的中文拼音的首字母?
- [菜鸟问题二]显示文本格式的问题
- HttpWebRequest提交信息后redirect to其他网页
- 数据库菜鸟提问 怎么将数据库中A+B这种项帮定到datagrid中
- 有一个子类对象但是基类声明,可否通过反射机制把他直接转化成子类声明
- winform控件的DataBinding似乎只能更新一次控件,那就不能算是DataBinding啊
具体GB2312可以表示那些字符,可参考纽约大学的对照表:
http://cs.nyu.edu/~yusuke/tools/unicode_to_gb2312_or_gbk_table.html从该表可以看到(char)65380,也就是U+FF64不仅在GB2312中不收录,连GBK(收录约2万多字)也不支持。
byte[] b = BitConverter.GetBytes(65380);
因为报文拼接后,是个string,其实在编译的时候,我是能查看到string每个字符的,但是string转byte[]之后,就转不成功了
如果说gb2312不能识别这些字符,为什么单步的时候能够查看呢
只有byte[]才有编码一说,而其他各种编码范围都只是Unicode的一个子集,当然也就有可能出现非法编码。而有些非法编码与该编码解析方式有冲突,你说这种情况下该怎么处理这些非法编码呢?
因为报文拼接后,是个string,其实在编译的时候,我是能查看到string每个字符的,但是string转byte[]之后,就转不成功了
如果说gb2312不能识别这些字符,为什么单步的时候能够查看呢是不是你的转换方法有问题,通常的做法是在发送端用Encoding.GetBytes将字符串转为字节数组,然后通过socket发送,在发送时,还需要将字节数组的长度放在内容前面。在接收端,首先接收字节数组的长度,再通过此长度用Encoding.GetString方法转换回字符串。在整个过程中,一般不使用字符数组做中间媒介。
直接字符串和byte数组做转换,不要再转char[ ]
socket通信,两边要求字符串编码不同,那就必须直接发送byte[ ],而不是发送string
报文本身是string,send的本身也是byte,直接转,没问题。但是过程中,我需要对string进行一些算法加密,加密完后的新string有些是不可见字符,转成byte就有问题了,转不了,只能转成?这个符号,也就是63
你不会直接将char数组转换成byte数组吗?
报文本身是string,send的本身也是byte,直接转,没问题。但是过程中,我需要对string进行一些算法加密,加密完后的新string有些是不可见字符,转成byte就有问题了,转不了,只能转成?这个符号,也就是63你加密好以后的 byte[]不要再转成string了。直接发送不就好了么?加密后的数组已经被打乱,如果你要再转成String肯定有可能会出现乱码,而且无法转回原先的byte[]。如果你非要显示,你可以用Convert.ToBase64String()。
你要发送string,就必须是一个可读的字符串,而接收方也必须跟你的编码一致
你要加密,string就变成不可读,那为什么还要发送string?
一个char转成两个byte啊
报文本身是string,send的本身也是byte,直接转,没问题。但是过程中,我需要对string进行一些算法加密,加密完后的新string有些是不可见字符,转成byte就有问题了,转不了,只能转成?这个符号,也就是63加密通常都是在字节级的,所以加密的结果应该就是byte[],何苦又把它转成字符串呢。如果实在蛋疼的厉害要转成字符串,建议使用Base64.