如何将4字节字符串编码为单个32位整数?
首先,我要说明一下,我不是计算机专业毕业的,也不是数学专业的,所以我会尽量简单明了。
我有一个四个字符的字符串(比如“isoy”),我需要把它作为一个32位的整数来传输。当然,在接收端,我需要把它解码回字符串。这个字符串只会包含大写字母A-Z,而且大小写不重要,这样可能会简单一些。
有趣的是,我在发送端使用的是PowerShell,而在接收端使用的是Linux。我可以在那边用Perl或Python,比较喜欢Python。其实我并不需要每种语言的答案,我最感兴趣的是PowerShell(C#也可以)在两个方向上的示例。
6 个回答
3
在编程中,有时候我们会遇到一些问题,可能是因为代码写得不够好,或者是我们对某些概念理解得不够透彻。比如,有人可能在使用某个库的时候,发现它的功能和自己想的不太一样,这时候就需要去查找资料,看看别人是怎么解决类似问题的。
在这个过程中,StackOverflow是一个非常有用的地方。这里有很多程序员分享他们的经验和解决方案。你可以在上面提问,也可以搜索别人遇到的类似问题,看看他们是怎么解决的。
总之,遇到问题不要慌,先去查查资料,看看有没有人遇到过类似的情况,学习别人的解决方法,慢慢你就会变得越来越熟练了。
// string -> int
uint ret = 0;
for ( int i = 0; i < 4; ++i )
{
ret |= ( str[i] << ( i * 8 ) );
}
// int -> string
for ( int i = 0; i < 4; ++i )
{
str[i] = ( ret >> ( i * 8 ) ) & 0xff;
}
8
在Python中,struct.unpack这个功能可以把一个4字节的字符串转换成整数,struct.pack
则是反过来的操作。
>>> import struct
>>> struct.unpack('i', 'isoy')[0]
2037347177
>>> struct.pack('i', 2037347177)
'isoy'
>>>
如果你需要的话,可以使用不同的格式来确保数据的字节顺序,比如大端序和小端序。大端序用'>i'
表示,小端序用'<i'
表示,而单纯的'i'
则会根据你电脑的默认设置来处理。
10
转换为32位无符号整数:
uint x = BitConverter.ToUInt32(Encoding.ASCII.GetBytes("isoy"), 0); // 2037347177
转换为字符串:
string s = Encoding.ASCII.GetString(BitConverter.GetBytes(x)); // "isoy"
BitConverter 会使用机器的本地字节序。