纠结的字符问题

macdonald25 2010-09-20 10:33:17
字符串由用户输入,可能是汉字英文数字符号的组合,想把字符串转换成16进制编码,另外,还要能将这16进制编码转换成原来的字符串。
问题来了:
汉字是2byte,汉字标点符号也是2byte,数字和英文是1byte,虽然我可以将字符串分割成单个字符,根据ASCII判断是汉字还是英文数字,进而转换成16进制,但是,当将16进制转换回来的时候,该怎么判断是汉字还是字符,因为存这些数据的地方大小固定,为了存尽量多的字符,不能加其他标识符之类的东西。
卡壳在这了,各位大侠给个思路。
...全文
138 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
gomoku 2010-09-20
  • 打赏
  • 举报
回复
看:
http://zh.wikipedia.org/zh/Gb2312


做学问的方法是一样的
macdonald25 2010-09-20
  • 打赏
  • 举报
回复
#16楼
如果用gb2312,那么我普通字符和数字的话,是占了一个字节还是2个字节?
gomoku 2010-09-20
  • 打赏
  • 举报
回复
那你用gb3212等编码。

Encoding.GetEncoding("gb2312")
macdonald25 2010-09-20
  • 打赏
  • 举报
回复
#14楼
ASCII字母继续使用1字节存储,重音文字、希腊字母或西里尔字母等使用2字节来存储,而常用的汉字就要使用3字节。辅助平面字符则使用4字节。

这样的编码和我的需求有冲突,汉字如果3字节的话,那么本来128bit固定大小就只能存5个汉字了。如果是汉字要能存8个,普通字符16个,如果一个汉字,那么就是15个。2个汉字14个。这样的
gomoku 2010-09-20
  • 打赏
  • 举报
回复

http://zh.wikipedia.org/zh-cn/UTF-8
macdonald25 2010-09-20
  • 打赏
  • 举报
回复
#7楼上善。
字符集这个确实需要指定,但是我现在的问题是要汉字2byte转换,英文字符数字1byte转换,存储之后这些数据再要转换回汉字,我如何知道哪2byte是汉字,哪1byte是英文和字符。开发的环境比较特殊,直接是用外接设备对存储单元无线读取。
米か臹 2010-09-20
  • 打赏
  • 举报
回复
GetBytes来回转应该都可以。
macdonald25 2010-09-20
  • 打赏
  • 举报
回复
#6楼。。如果我输入的字符不到标准的长度,那么,你这个方法里面的0啊,255啊都给我显示出来了。。
macdonald25 2010-09-20
  • 打赏
  • 举报
回复
#9楼
这样的方法,无论你字符串多长,最后都是8位的十进制,我怎么显示十六进制字符?
- -!我很菜。。
xyzflying 2010-09-20
  • 打赏
  • 举报
回复
直接转化成字符。
char *tmp=System.Runtime.InteropServices.Marshal.StringToHGlobalAnsi(your_string);
honkerhero 2010-09-20
  • 打赏
  • 举报
回复
0不是标识符的作用,汉字是双位,直接转好像不能成16进制(0-9a-f),记不清了

你可以不加标识符试试,反正你的字符串和16进制都是以byte数组为媒介,只要保证这个媒介能还原就行,怎么过去,怎么回来,没有问题的,

还有String本来就是unicode的,getBytes,字符集选UTF-16好像英文的高位都是0
烈火蜓蜻 2010-09-20
  • 打赏
  • 举报
回复
[Quote=引用楼主 macdonald25 的回复:]
字符串由用户输入,可能是汉字英文数字符号的组合,想把字符串转换成16进制编码,另外,还要能将这16进制编码转换成原来的字符串。
问题来了:
汉字是2byte,汉字标点符号也是2byte,数字和英文是1byte,虽然我可以将字符串分割成单个字符,根据ASCII判断是汉字还是英文数字,进而转换成16进制,但是,当将16进制转换回来的时候,该怎么判断是汉字还是字符,因为存这些数据的地方大小固定,为了……
[/Quote]

首先你需要确认你要用的是什么编码,我看一般是用UTF8比较合适,

然后呢用Encoding.UTF8.GetBytes()来获取这个字符串的bytes字节流,然后把这个字节流转换成十六进制的字符串,

而要转换回来的时候,先把十六进制的字符串,转换成字节流,然后再用Encoding.UTF8.GetString()生成原来的字符串
liulangdeyuyu 2010-09-20
  • 打赏
  • 举报
回复
/// <summary>
/// FormatterHelper 序列化,反序列化消息的帮助类
/// </summary>

public class FormatterHelper
{
/// <summary>
/// 对象序列化为二进制比特数组
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static byte[] Serialize(object obj)
{

IFormatter formatter = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
byte[] b;
formatter.Serialize(ms, obj);
ms.Position = 0;
b = new byte[ms.Length];
ms.Read(b, 0, b.Length);
ms.Close();
return b;



}


/// <summary>
/// 反序列化得到一个对象
/// </summary>
/// <param name="buffer"></param>
/// <returns></returns>
public static object Deserialize(byte[] buffer)
{

IFormatter formatter = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
ms.Write(buffer, 0, buffer.Length);
ms.Position = 0;
object obj = formatter.Deserialize(ms);
return obj;



}

}// end class
macdonald25 2010-09-20
  • 打赏
  • 举报
回复
#2楼的大侠
getByte我也知道,如果里面有汉字的话,需要指定字符集,这样就是英文和数字也用双字节表示,结果还是会少存储部分信息
macdonald25 2010-09-20
  • 打赏
  • 举报
回复
你这个0是标识符的作用,如果可以加,我也不纠结了。我现在的需求是最大限度在有限的128位里存进字符,如果我加了0,势必会减少几位。
gomoku 2010-09-20
  • 打赏
  • 举报
回复
用UTF8或者Unicode编码
@井九 2010-09-20
  • 打赏
  • 举报
回复
GetBytes来回转应该都可以。
自己判断的话,汉字高字节跟数字和英文是能区分的
honkerhero 2010-09-20
  • 打赏
  • 举报
回复
这个简单啊,不用管汉字还是字母

你可以参考一下加密后如何把字符串显示为16进制,把字符串转成BYTE数组,往里边隔位插0,转换成字符串就行,回来时,把0位去掉,转成字符串就行

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧