[问题]C#中,怎样把int变量转成string(非ToString方式)

easydw 2010-09-01 09:21:28
昨天发的帖子没把问题说清楚,我放出现有的代码和存在的问题,请各位高手再指点下.

--整数转字符串
int Num = 0x12BFFE00;
byte[] ayData = BitConverter.GetBytes(Num);
string str = Encoding.ASCII.GetString(ayData);

--字符串转整数
byte[] ayData = Encoding.ASCII.GetBytes(str);
int nRet = BitConverter.ToInt32(ayData, 0);

问题:先经过"整数转字符串",然后把得到的str再经"字符串转整数",得到的nRet与原Num值不同(如果是0x123456这样数字,就运行正常).
经过分析发现,怀疑Encoding.ASCII.GetString这句有问题,Num中有的"BF"和"FE"字节的最高位都为1,而ASCII貌似遇到这种情况时处理的不好,请各位老大指点.

...全文
1320 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dream83619 2010-09-02
  • 打赏
  • 举报
回复
服务端中有一个behavior是控制并发访问的,可以查一下serviceThrottling的用法,也可用程序控制。

<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehavior">
<serviceThrottling maxConcurrentCalls="999" maxConcurrentSessions="999"
maxConcurrentInstances="999" />

</behavior>
</serviceBehaviors>
</behaviors>

gomoku 2010-09-01
  • 打赏
  • 举报
回复
不理解的是 - 既然最终要用4个bytes,为什么要换成字符串?

如果要放在C#中,存个int就可以了,要存盘也是存个int就可以了。
如果要给C++传参数,或放到SQL server上,直接传int不就可以了?

甚至可以直接传地址:
C++
void GetData(const char* str)
{
char c1 = str[0];
char c2 = str[1];
char c3 = str[2];
char c4 = str[3];
}
C#
void GetData(ref int i);
alan_219_2008 2010-09-01
  • 打赏
  • 举报
回复
强制转换
Dream83619 2010-09-01
  • 打赏
  • 举报
回复
GetEncoding("ISO-8859-15") 8 bits ascii


int Num = 0x12BFFE00;
byte[] ayData = BitConverter.GetBytes(Num);
string str = Encoding.GetEncoding("ISO-8859-15").GetString(ayData);
ayData = Encoding.GetEncoding("ISO-8859-15").GetBytes(str);
int nRet = BitConverter.ToInt32(ayData, 0);
zierben 2010-09-01
  • 打赏
  • 举报
回复
先说不会,
不过我想说的是,你这个是显示加密,基本上最容易破解的就是它了!
随便找几个值,测试几下,就能把你的对应关系找到,跟不加密也没有啥区别。
如果要做个人软件,这个还不如随便找个md5的算法来的好。
当然你认为位数太低的md5不安全,可以做个二次加工
安静写代码 2010-09-01
  • 打赏
  • 举报
回复
学习下,没遇到过这种问题
gomoku 2010-09-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wuyazhe 的回复:]
用UNICODE吧。
int Num = 0x0132b86f;
byte[] ayData = BitConverter.GetBytes(Num);
string str = Encoding.Unicode.GetString(ayData);
ayData = Encoding.Unicode.GetBytes(str);
[/Quote]
认真来说这不完全正确的。

C#中的Unicode编码实际上是Unicode-16编码。因为双字节最多放65536个字符,那些在65536以外的字符必须要多个字节表示。因此Unicode-16中有些点是Surrogate(类似Escape),比如high surrogates(D800–DBFF)后面必须跟随着low surrogates(DC00–DFFF)。

这使的有些int没有办法转成两个字符的Unicode-16(如果int包含着一些特殊数字,比如D801,D802...):

int Num = 0x1234D800;
byte[] ayData = BitConverter.GetBytes(Num);
string str = Encoding.Unicode.GetString(ayData);
// str[0] = 0xfffd, 不是0xD800
// str[1] = 0x1234


兔子-顾问 2010-09-01
  • 打赏
  • 举报
回复
没有扩大吧。你的int为4字节,unicode不过是2的倍数,4正好是2的倍数。不会多的。
easydw 2010-09-01
  • 打赏
  • 举报
回复
Encoding.Unicode.GetString 都是双字符的,让长度整整扩大了1倍! 太浪费了
assky124 2010-09-01
  • 打赏
  • 举报
回复
ASCII只有128个字符,超过128自然不认识

而一个字节为256

试试UTF8编码格式
ljb3326 2010-09-01
  • 打赏
  • 举报
回复
不懂 学习!!!!!!!!!
deyygywxf 2010-09-01
  • 打赏
  • 举报
回复
int Num = 0x12BFFE00;
byte[] ayData = BitConverter.GetBytes(Num);
string str = Encoding.Unicode.GetString(ayData);


ayData = Encoding.Unicode.GetBytes(str);
int nRet = BitConverter.ToInt32(ayData, 0);
hitlcyu19 2010-09-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 net_lover 的回复:]

你可以这样解决
C# code
int Num = 0x12BFFE00;
byte[] ayData = BitConverter.GetBytes(Num);
string str = Encoding.Unicode.GetString(ayData);


ayData = Encoding.Unicode.GetBytes(str);
int nRet = BitConverter……
[/Quote]
兔子-顾问 2010-09-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ruanwei1987 的回复:]
我测试了下 wuyazhe的对了,可是 tostring(“X2”)这个之后变成了12BFFE00 少了前面的0X
[/Quote]

囧,你雷到我了,那是打印输出的内容,关键的是nRet中数字对就可以了。

[Quote=引用 5 楼 ruanwei1987 的回复:]
"目标数组的长度不足,无法复制集合中的所有项。请检查数组索引和长度。"
[/Quote]
的确,少了1个字节。
兔子-顾问 2010-09-01
  • 打赏
  • 举报
回复
用UNICODE吧。

int Num = 0x0132b86f;
byte[] ayData = BitConverter.GetBytes(Num);
string str = Encoding.Unicode.GetString(ayData);
ayData = Encoding.Unicode.GetBytes(str);
int nRet = BitConverter.ToInt32(ayData, 0);
Console.WriteLine("0x" + nRet.ToString("X8"));
ruanwei1987 2010-09-01
  • 打赏
  • 举报
回复
"目标数组的长度不足,无法复制集合中的所有项。请检查数组索引和长度。"
ruanwei1987 2010-09-01
  • 打赏
  • 举报
回复
我测试了下 wuyazhe的对了,可是 tostring(“X2”)这个之后变成了12BFFE00 少了前面的0X
easydw 2010-09-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wuyazhe 的回复:]
因为有一些超过128的字节,超过的用ascii会被替换为ascii标准字符,所以就会出错。一定要这么做。就用一个宽字节的字符集,例如中文的。


C# code
int Num = 0x12BFFE00;
byte[] ayData = BitConverter.GetBytes(Num);
string str = Encoding.GetEncoding(936).GetStrin……
[/Quote]

请试下Num = 0x0132b86f; 这样结果还是不正常!
兔子-顾问 2010-09-01
  • 打赏
  • 举报
回复
因为有一些超过128的字节,超过的用ascii会被替换为ascii标准字符,所以就会出错。一定要这么做。就用一个宽字节的字符集,例如中文的。

int Num = 0x12BFFE00;
byte[] ayData = BitConverter.GetBytes(Num);
string str = Encoding.GetEncoding(936).GetString(ayData);
ayData = Encoding.GetEncoding(936).GetBytes(str);
int nRet = BitConverter.ToInt32(ayData, 0);
Console.WriteLine(nRet.ToString("X2"));


输出结果正确。
孟子E章 2010-09-01
  • 打赏
  • 举报
回复
你可以这样解决
int Num = 0x12BFFE00;
byte[] ayData = BitConverter.GetBytes(Num);
string str = Encoding.Unicode.GetString(ayData);


ayData = Encoding.Unicode.GetBytes(str);
int nRet = BitConverter.ToInt32(ayData, 0);
加载更多回复(4)

110,533

社区成员

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

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

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