社区
C#
帖子详情
纠结的字符问题
macdonald25
2010-09-20 10:33:17
字符串由用户输入,可能是汉字英文数字符号的组合,想把字符串转换成16进制编码,另外,还要能将这16进制编码转换成原来的字符串。
问题来了:
汉字是2byte,汉字标点符号也是2byte,数字和英文是1byte,虽然我可以将字符串分割成单个字符,根据ASCII判断是汉字还是英文数字,进而转换成16进制,但是,当将16进制转换回来的时候,该怎么判断是汉字还是字符,因为存这些数据的地方大小固定,为了存尽量多的字符,不能加其他标识符之类的东西。
卡壳在这了,各位大侠给个思路。
...全文
138
18
打赏
收藏
纠结的字符问题
字符串由用户输入,可能是汉字英文数字符号的组合,想把字符串转换成16进制编码,另外,还要能将这16进制编码转换成原来的字符串。 问题来了: 汉字是2byte,汉字标点符号也是2byte,数字和英文是1byte,虽然我可以将字符串分割成单个字符,根据ASCII判断是汉字还是英文数字,进而转换成16进制,但是,当将16进制转换回来的时候,该怎么判断是汉字还是字符,因为存这些数据的地方大小固定,为了存尽量多的字符,不能加其他标识符之类的东西。 卡壳在这了,各位大侠给个思路。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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位去掉,转成字符串就行
c语言中
字符
数组的
问题
很
纠结
啊 请教高手!!!
下面是我的代码:
#include
#include
void main(void)
{
char a[3];
gets(a);
int i=0;
while(a[i]!='/0')
{
printf("%c/n",a[i]);
i++;
}
puts(a);
print
mysql 修改存储过程执行
字符
集_MYSQL存储过程
字符
集 一个非常
纠结
的有关
问题
mysql存储过程
字符
集 一个非常
纠结
的
问题
create testtableA(zhongwen text(256),)DEFAULT CHARSET=utf8;create testtableB(writezhongwen text(256),in text(256),)DEFAULT CHARSET=utf8;DELIMITER //CREATE PROCEDURE test(IN inzh...
ashx页面返回json
字符
串|jQuery 的ajax处理请求的
纠结
问题
纠结
,整了半天的jquery的ajax请求数据。 遇到的
问题
: 1 ajax方法一直进入error方法里,进入到请求的.ashx页面。这个
问题
,我未找到是什么原因。反正我使用了一下的代码,就好了。 $.get("api.ashx?openid=" + openid+"&sex="+sex+"&tel="+tel+"&usernam...
算法---
字符
按ASCII排序
今天这道题在难度上最多算两颗星吧。开始是把
字符
转化为ASCII然后将值存在了list里面,用sort()方法对list进行排序,接着再将ASCII码转化为
字符
进行输出。题并不难,但是很多同学可能会想不清楚,就是在输出的时候怎么保证排序后的ASCII码跟自己输入的
字符
进行对应,起初我也担心过,甚至还想过用二维数组,后来觉得自己真的是多此一举。我们可以用
字符
转ASCII码,那输出的时候再转回来不久完了...
【算法】
字符
串-洛谷
思路是先腾出空位然后,然后填进要插入的
字符
串没错。但我想要在一个循环中完成,腾一个就填一个。后来发现思路是混乱了的,需要移动的
字符
串与需要填入的
字符
串长度并不一致。我将这一行代码修改如下,就通过了洛谷的测试。可能细心的读者已经发现了
问题
,“你怎么把整个
字符
串都后移了?,腾出空位时需要访问原
字符
串,我使用的代码如下。然而实际上随着
字符
串的后移,第一个。的位置其实是在变化的,已经不是原来的
字符
串结尾了。,我需要将三个
字符
各后移一位,但只需要填入一个
字符
d。只需要将腾出空位的代码修改如下,即可排除该bug。
C#
111,129
社区成员
642,541
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章