如何将4字节字符串编码为单个32位整数?

时间:2009-11-23 03:09:30

标签: c# python algorithm powershell

首先,免责声明。我不是CS毕业生也不是数学专业,所以简单很重要。

我有一个四字符串(例如“isoy”),我需要将其作为单个32位整数字段传递。当然在另一端,我需要将其解码回字符串。该字符串只包含A-Z,如果有帮助,则大小写不重要。

有趣的是,我从发送端的PowerShell和接收端的Linux开始。我可以在那里使用Perl或Python,优先选择Python。我实际上并不需要每种语言的答案,我最感兴趣的是两种方式的PowerShell(C#也很好)的例子。

6 个答案:

答案 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.packstruct.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个字符)。