php binascii.crc32,PHP中crc32b的输出不等于Python

博客内容涉及将PHP代码中涉及CRC32B哈希和XZ压缩的部分转换为Python3,但在转换过程中遇到了输出不一致的问题。作者提供了原始PHP代码和转换后的Python代码,显示了在步骤1和2中的不同输出。问题可能在于哈希逆序和XZ压缩的实现细节。
摘要由CSDN通过智能技术生成

我试图将PHP代码片段转换为Python3代码,但是print和{}的输出是不同的。在

你可以在第一步看到。在

你知道问题出在哪里吗?我也附加了输入数组,但我认为它们是相等的。在�W2+ vs ee7523b2

编辑

当我将raw从TRUE切换到FALSE时,第一步的输出是相同的。$d = strrev(hash("crc32b", $d, FALSE)) . $d

但问题是我必须把PHP转换成Python,而不是相反,因为在第2步中我需要有相同的输出。在

PHP输出(CMD)

^{pr2}$

PYTHON输出

^{3}$

PHP<?php

$suma = "100";

$datum = "20190101";

$varsym = "11111111";

$konsym = "";

$specsym = "";

$poznamka = "Faktúra";

$iban = "SK6807200002891987426353";

$swift = "";

$d = implode("\t", array(

0 => '',

1 => '1',

2 => implode("\t", array(

true,

$suma, // SUMA

'EUR', // JEDNOTKA

$datum, // DATUM

$varsym, // VARIABILNY SYMBOL

$konsym, // KONSTANTNY SYMBOL

$specsym, // SPECIFICKY SYMBOL

'',

$poznamka, // POZNAMKA

'1',

$iban, // IBAN

$swift, // SWIFT

'0',

'0'

))

));

// 0

echo "0 -> ".$d."\n";

$d = strrev(hash("crc32b", $d, TRUE)) . $d;

// 1

echo "1 -> ".$d."\n";

$x = proc_open("/usr/bin/xz '--format=raw' '--lzma1=lc=3,lp=0,pb=2,dict=128KiB' '-c' '-'", [0 => ["pipe", "r"], 1 => ["pipe", "w"]], $p);

fwrite($p[0], $d);

fclose($p[0]);

$o = stream_get_contents($p[1]);

fclose($p[1]);

proc_close($x);

$d = bin2hex("\x00\x00" . pack("v", strlen($d)) . $o);

// 2

echo "2 -> ".$d."\n";

?>

PYTHONdef crc32b(x):

h = zlib.crc32(x)

x='%08X' % (h & 0xffffffff,)

return x.lower()

t = "\t"

gen = t.join(["1",

"100", # SAME VARIABLES

"EUR",

"20190101",

"11111111",

"",

"",

"",

"Faktúra",

"1",

"SK6807200002891987426353",

"",

"0",

"0"]

)

d = t.join([

"", "1", gen])

# 0

print(f"0 -> {d}")

hashD = crc32b(d.encode()) # OK

hashD = hashD[::-1]

# hashD = str(binascii.unhexlify(hashD))

d = hashD + d

# 1

print(f"1 -> {d}")

args = shlex.split("xz '--format=raw' '--lzma1=lc=3,lp=0,pb=2,dict=128KiB' -c -")

process = subprocess.Popen(args, shell=False, stdin=subprocess.PIPE, stdout=subprocess.PIPE,

stderr=subprocess.PIPE)

output = process.communicate(d.encode())

pack = "\x00\x00" + str(struct.pack("H", len(d))) + str(output[0])

d = binascii.hexlify(pack.encode())

# 2

print(f"2 -> {d}")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值