Python中的空格填充二进制字符串

2 投票
1 回答
957 浏览
提问于 2025-04-17 02:26

我需要把这个PHP函数转换成Python,但我连什么是用空格填充的二进制字符串都不知道。

pack('A*', $string);

Python有一个叫做struct.pack的东西,可能应该用这个,但我到这里就卡住了。有人能帮我解释一下这个行为吗?

谢谢!


更新:

这是我需要在Python中实现的完整代码。到现在为止,我从来没听说过pack(),所以我在试着理解它到底是干什么的,这样我才能在Python中实现:

function getSIGN($PID, $ID, $DESC, $PRICE, $URL, $EMAIL, $PWD) {
    $bHash = pack('A*', $PID . $ID . $DESC . $PRICE . $URL . $EMAIL);
    $bPWD = pack('A*', $PWD);
    $SIGN = strtoupper(hash_hmac('sha256', $bHash, $bPWD, false));
    return $SIGN;
}

1 个回答

1

我觉得这没什么用。

$string = 'asdf';
print pack('A10', $string) . "|<-\n";

这样会给你

asdf      |<-

因为*的意思是“尽可能多地取”,所以根本没有理由去填充。

在我看来,你可以直接把整行代码扔掉。


关于你的更新:

pack这个函数其实没有什么用,除了可能会把所有非字符串的参数隐式地转换成字符串。

这是你在Python中应该怎么做。我顺便调整了一下参数的顺序,这样我可以使用参数打包(这和字符串打包完全不同;)。

import hmac, hashlib

def get_sign(key, *data):
     msg = ''.join(str(item) for item in data)
     h = hmac.new(key, msg, hashlib.sha256)
     return h.hexdigest().upper()

PHP:

$ print getSIGN(1234, 456, "foo", '123.45', 'http://example.com', 'foo@example.com', 'blah');  
7FA608240FA2DC04F15DB2CDB58C83F4ED6C28C5C5B4063C5A7605F9D69F170B

Python:

In [12]: get_sign('blah', 1234, 456, "foo", '123.45',
                  'http://example.com',  'foo@example.com')
Out[12]: '7FA608240FA2DC04F15DB2CDB58C83F4ED6C28C5C5B4063C5A7605F9D69F170B'

撰写回答