Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中对大字符串的按位操作_Php_32bit 64bit_Bitwise Operators - Fatal编程技术网

PHP中对大字符串的按位操作

PHP中对大字符串的按位操作,php,32bit-64bit,bitwise-operators,Php,32bit 64bit,Bitwise Operators,这是我的问题。出于兼容性原因,我目前正在尝试在PHP中实现一些加密标准。我现在正在研究的是SHA256和SH512。它们都是相当直截了当的标准,我对此没有异议 但是,SHA512需要对64位整数进行逐位运算。由于PHP只能有32位整数(编译时),这给我留下了一个问题。如何实现必要的按位函数(模、移位、旋转、加法、异或和或等),以保持兼容性和合理的性能水平 我知道,对于他们中的一些人来说,实现函数只需要2个32位整数就可以了。但是,对于shift和rotate,这将如何工作 我想做的是以二进制形式

这是我的问题。出于兼容性原因,我目前正在尝试在PHP中实现一些加密标准。我现在正在研究的是SHA256和SH512。它们都是相当直截了当的标准,我对此没有异议

但是,SHA512需要对64位整数进行逐位运算。由于PHP只能有32位整数(编译时),这给我留下了一个问题。如何实现必要的按位函数(模、移位、旋转、加法、异或和或等),以保持兼容性和合理的性能水平

我知道,对于他们中的一些人来说,实现函数只需要2个32位整数就可以了。但是,对于
shift
rotate
,这将如何工作

我想做的是以二进制形式存储字符串(作为
01010
的字符串)。这样,所有按位操作都将完全独立于体系结构。但这可能会导致性能大幅下降,因为它们在标准(以及库的其他部分)中使用得异常频繁

因此,我的问题是:如何在32位PHP编译中轻松地允许至少64位字符串操作,同时保持每个步骤的合理性能水平


哦,我的目标是这里的可移植性,所以没有扩展。我会考虑其他的图书馆,但它们必须是便携式的…… > p>你可以使用。从4.0.4开始,它就被证明是非常好的,并且与PHP一起使用。显然,在给定的环境中,无法使用表示INT的本机数据结构,因此必须在其上使用数据结构。这当然意味着你将无法应用你给出的例子。。。0xFFFFFF>>4但是您可以使用mystruct(0xFFFFFF)>>4(mystruct是您定义的数据结构)


如果这听起来像是一个计划,请告诉我,也许我可以帮助您完成解决方案的其余部分。

将值存储在字符串中确实是正确的方法


但不是存储1和0,而是在每个字节中存储8位。从字符串中提取部分整数仍然很容易。您确实需要手动执行所有操作,如移位。

您可以将64位数字视为两个32位数字,并在这两个数字之间切换“进位”部分。@Sal:当然。但这是一种皮塔。我想如果这是我能做的最好的,那就这样吧。但是如果有更简洁的方法,我洗耳恭听……通过创建一个“BitString”对象来概括该功能,该对象只是整数数组的包装器,其中包含一些按位函数,这些函数实现了Salman所说的功能。@Kendall:我会的,只是PHP的按位函数似乎是算术函数,而不是逻辑函数。所以
0xFFFFFF>>4==0xFFFFFFFF
。因此,如果不进行大规模的返工,即使INT也无法正常工作……同样,扩展已经不存在了。更不用说BCMath没有按位函数,所以这里没有用,即使我们想提及它们。。。同样,我在寻找逐位运算,而不仅仅是任意数学……考虑到PHP不允许重写运算符(也不允许真正的结构),我不确定这是否可行。如果您知道PHP中的一种方法,我洗耳恭听……当谈到数据结构时,我想到的是一个类实例,但是,与ocaml等不同,您是正确的-重写运算符是不可能的:-(好吧,我想到将0和1存储在字符串中的唯一原因是,实现每个逐位运算符很简单。(左移位只是附加一个0,右移位只是删除一个尾随数字,等等)…但是它不会很快…如果你使用二进制,并提取每字节(甚至每32位)的部分)您仍然可以使用标准的按位运算符,但您需要确保像左移这样的操作继续到下两个字节。