簡體   English   中英

如何將4字節字符串編碼為單個32位整數?

[英]How do I encode a 4-byte string as a single 32-bit integer?

首先,免責聲明。 我不是CS畢業生也不是數學專業,所以簡單很重要。

我有一個四字符串(例如“isoy”),我需要將其作為單個32位整數字段傳遞。 當然在另一端,我需要將其解碼回字符串。 該字符串只包含AZ,如果有幫助,則大小寫不重要。

有趣的是,我從發送端的PowerShell和接收端的Linux開始。 我可以在那里使用Perl或Python,優先選擇Python。 我實際上並不需要每種語言的答案,我最感興趣的是兩種方式的PowerShell(C#也很好)的例子。

到32位無符號整數:

uint x = BitConverter.ToUInt32(Encoding.ASCII.GetBytes("isoy"), 0); // 2037347177

要字符串:

string s = Encoding.ASCII.GetString(BitConverter.GetBytes(x));      // "isoy"

BitConverter使用機器的本機字節序。

對於Python, struct.unpack完成這項工作(將一個4字節的字符串轉換為int - struct.pack以另一種方式):

>>> import struct
>>> struct.unpack('i', 'isoy')[0]
2037347177
>>> struct.pack('i', 2037347177)
'isoy'
>>> 

(你可以使用不同的格式來確保big-endian或little-endian編碼,如果你需要 - 分別是'>i''<i' - 而不僅僅是普通的'i' ,它使用任何編碼原生的機)。

// 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;
}

使用PowerShell語法可以這樣做(非常類似於dtb解決方案):

PS> $x = [BitConverter]::ToUInt32([byte[]][char[]]'isoy', 0)
PS> [char[]][BitConverter]::GetBytes($x) -join ''
isoy

你必須要注意Linux方面的字節順序。 如果它在英特爾處理器上運行,我認為應該沒問題(與PowerShell方面相同的字節順序)。

請查看Python手冊中的struct標准庫模塊。 它有兩個函數: struct.packstruct.unpack 您可以使用“L”(無符號長整數)格式字符。

除了字節打包,您還可以考慮將26個字符的字母表編碼為0-25而不是AZ。

因此,不必擔心大端和小端,你可以從“字母”轉到這樣的數字:

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然后回來。 這取決於語言。

您可以輕松地將其置於循環中。 我展示了展開的循環以使事情變得更加明顯。

將字母打包成字節更常見,因此您可以使用移位 按位運算進行編碼和解碼。 但是通過我上面展示的方式,你可以將六個字母打包成一個32位的數字,而不僅僅是四個。 這很好,因為您可以將股票市場股票代碼符號保存在一個32位值中(共同基金股票代碼符號為5個字符)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM