首先,免责声明。我不是CS毕业生也不是数学专业,所以简单很重要。
我有一个四字符串(例如“isoy”),我需要将其作为单个32位整数字段传递。当然在另一端,我需要将其解码回字符串。该字符串只包含A-Z,如果有帮助,则大小写不重要。
有趣的是,我从发送端的PowerShell和接收端的Linux开始。我可以在那里使用Perl或Python,优先选择Python。我实际上并不需要每种语言的答案,我最感兴趣的是两种方式的PowerShell(C#也很好)的例子。
答案 0 :(得分:10)
到32位无符号整数:
uint x = BitConverter.ToUInt32(Encoding.ASCII.GetBytes("isoy"), 0); // 2037347177
要字符串:
string s = Encoding.ASCII.GetString(BitConverter.GetBytes(x)); // "isoy"
BitConverter使用机器的本机字节序。
答案 1 :(得分:8)
对于Python,struct.unpack完成工作(将4字节字符串转换为int - struct.pack
转向另一种方式):
>>> import struct
>>> struct.unpack('i', 'isoy')[0]
2037347177
>>> struct.pack('i', 2037347177)
'isoy'
>>>
(如果您需要,可以使用不同的格式来确保大端或小端编码 - 分别为'>i'
和'<i'
- 而不仅仅是普通的'i'
使用机器本机的任何编码。)
答案 2 :(得分:3)
// 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;
}
答案 3 :(得分:3)
使用PowerShell语法可以这样做(非常类似于dtb解决方案):
PS> $x = [BitConverter]::ToUInt32([byte[]][char[]]'isoy', 0)
PS> [char[]][BitConverter]::GetBytes($x) -join ''
isoy
你必须注意Linux方面的字节顺序。如果它在Intel处理器上运行,我认为应该没问题(与PowerShell端相同)。
答案 4 :(得分:2)
请查看Python手册中的struct标准库模块。它有两个功能:struct.pack
和struct.unpack
。您可以使用'L'(无符号长)格式字符。
答案 5 :(得分:2)
除了字节打包外,您还可以考虑将26个字符的字母编码为0-25而不是A-Z。
所以不用担心大端和小端,你可以从“字母”转到这样的数字:
val=letter0+letter1*26+letter2*26*26+letter3*26*26*26;
从val回到字母,你做这样的事情:
letter0=val%26;
letter1=(val/26)%26;
letter2=(val/(26*26))%26;
letter3=(val/(26*26*26))%26;
其中“%”是您的语言模数运算符,“/”是整数除法。
你显然需要一种方法从'A' - 'Z'到0-25然后回来。这取决于语言。
您可以轻松地将其置于循环中。我展示了展开的循环以使事情变得更加明显。
将字母打包成字节更为常见,因此您可以使用 shift 和和按位操作进行编码和解码。但是通过我上面展示的方式,您可以将六个字母打包成一个32位数字,而不仅仅是四个。这很好,因为您可以将股票市场股票代码符号保存在一个32位值中(共同基金股票代码符号为5个字符)。