【问题标题】:4 bytes big-endian to int4 字节大端到 int
【发布时间】:2021-08-03 08:57:07
【问题描述】:

我有一个文件,其中包含要解释的数据(关键字),并以 4 字节的大端序开始以确定关键字的数量。我似乎无法从中获得正确的整数值。

$bytes = "00000103";
$keywords = preg_replace("/(.{2})(.{2})(.{2})(.{2})/u", "\x$1\x$2\x$3\x$4", $bytes);
var_dump($keywords);
$unpacked = unpack("N", $keywords);
var_dump($unpacked);

输出(不正确):

string(16) "\x00\x00\x01\x03"
array(1) {
  [1]=>
  int(1551380528)
}

出于测试目的,我将 $keywords 变量更改为:

$bytes = "\x00\x00\x01\x03";

它输出(正确):

string(4) ""
array(1) {
  [1]=>
  int(259)
}

如何更改 $keywords 的数据类型?搜索了很多,但不幸的是无法让它工作。

PS。发布后,它不会在 string(4) 的正确输出中显示其中的 2 个字符(带问号的框)。

【问题讨论】:

  • 要更改数据类型,您可以直接转换它,就像任何(int) (string) 等一样。但是数据类型是您的问题吗?
  • 如果关闭,也许我的解释。但是,两个 $keywords 都输出到一个字符串,而第一个(不正确)有 16 个字符,而第二个(正确)有 2 个字符。
  • 没有解释很好,但我在两个值上都使用gettype(),它们是相同的,但由于某种原因,严格比较对它们都抛出错误,这告诉我这可能是一个preg_* 函数的编码问题,所以我现在只是在谷歌上搜索

标签: php preg-replace pack unpack


【解决方案1】:

您可以简单地使用hexdec-function:

$bytes = "00000103";
$dec = hexdec($bytes);
var_dump($dec);  //int(259)

【讨论】:

  • 我仍然想知道为什么 OP 实际上不起作用。也许这是 PHP 中的一个错误
  • 这不是错误。像 "\x00\x00\x01\x03" 这样的字符串由 PHP 解析器解释。如果这样的表达式是由 PHP 动态生成的,这将不起作用。
  • 我可以看到,但这是在哪里记录的?我在任何地方都找不到它,strings 也没有任何关于十六进制的文档。如果没有记录,你只是假设它是故意的。为解决方法 +1。
  • @Jaquarh:在 PHP Doc "strings" 上,它应该包含大部分内容:1.) PHP 中的字符串是二进制的,2.) 双引号 (") 的转义序列字符串。最后但同样重要的是:3.) 如何在双引号字符串中解释美元符号 ($)。特别是对于最后一个,preg_replace PHP Doc 页面的研究应该揭示如何正确编码替换字符串的见解。
  • 我的意思是,这没什么意义,因为那为什么unpack("N", "{$keywords}") 不起作用?也许我只是不明白“字符串是二进制的”真正等同于什么。无论哪种方式,有趣的是它如何以不同的方式处理变量。 @hakre
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-28
  • 1970-01-01
  • 2010-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多