【问题标题】:Manipulate Bytes like Java in PHP在 PHP 中像 Java 一样操作字节
【发布时间】:2016-08-13 19:53:29
【问题描述】:

我有一个 Java 函数,我需要一个 PHP 中的等效函数。如果有帮助,我将使用它来解析 MD5 哈希。

public static byte[] asBin(String paramString)
{
    if (paramString.length() < 1)
      return null;
    byte[] arrayOfByte = new byte[paramString.length() / 2];
    for (int i = 0; i < paramString.length() / 2; i++) {
      int j = Integer.parseInt(paramString.substring(i * 2, i * 2 + 1), 16);
      int k = Integer.parseInt(paramString.substring(i * 2 + 1, i * 2 + 2), 16);

      arrayOfByte[i] = ((byte)(j * 16 + k));
    }
    return arrayOfByte;
}

现在我得到了这个,但输出不一样。

function asBin($str){
    if($str == "") return null;
    $bytes = array();
    for($i = 0; $i < strlen($str) / 2; $i++){
        $j = intval(substr($str, $i * 2, $i * 2 + 1), 16);
        $k = intval(substr($str, $i * 2 + 1, $i * 2 + 2), 16);
        $bytes[$i] = intval($j * 16 + $k);
    }
    return $bytes;
}

【问题讨论】:

  • 或者直接使用hex2bin()
  • 当您将int 转换为byte 时,可能会出现溢出(在java 代码中)(请参阅(byte)(j * 16 + k)

标签: java php string byte


【解决方案1】:

这是答案(您需要在代码中添加一些更改)

function asBin($str) {
    $byte_max = 127;
    $byte_min = -128;
    if($str == "") {
        return null;
    }
    $bytes = array();
    for($i = 0; $i < floor(strlen($str) / 2); $i++){
        $j = intval(substr($str, $i * 2, 1), 16);
        $k = intval(substr($str, $i * 2 + 1, 1), 16);
        $value = $j * 16 + $k;
        // emulation byte-overflow in java
        if ($value > $byte_max) {
            $value = $value - $byte_max + $byte_min - 1;
        }
        $bytes[$i] = $value;
    }
    return $bytes;
}

详情

替代答案

你也可以用一张地图改变你的功能。 根据您的代码,可能的答案 - 只需为所有数字对生成 php 映射:

function init_bin_map() {
    $byte_max = 127;
    $byte_min = -128;
    $bin_map = array();
    for ($i = 0; $i <= 15; $i++) {
        for ($j = 0; $j <= 15; $j++) {
            $key = strval(dechex($i)) . strval(dechex($j));
            $value = $i * 16 + $j;
            // emulation of overflow in java
            if ($value > $byte_max) {
                $value = $value - $byte_max + $byte_min - 1;
            }
            $bin_map[$key] = $value;
        }
    }
    return $bin_map;
}

$bin_map = init_bin_map();

function asBin2($str, $bin_map) {
    $str = strtolower($str);
    if($str == "") return null;
    $bytes = array();
    for ($i = 0; $i < strlen($str) - 1; $i += 2) {
        $key = substr($str, $i, 2);
        $bytes[$i/2] = $bin_map[$key];
    }
    return $bytes;
}

我们有:

$bin_map = array(
    "00" => 0,
    "01" => 1,
    ...
    "80" => -128,
    "81" => -127,
    "82" => -126,
    "83" => -125,
    ...
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-16
    相关资源
    最近更新 更多