【问题标题】:Get four 16bit numbers from a 64bit hex value从 64 位十六进制值中获取四个 16 位数字
【发布时间】:2023-03-08 04:59:01
【问题描述】:

我已经解决了这些相关问题:

但我没有得到答案可能是因为我不了解 64 位或 16 位值。

我发布了一个关于 Picasa 和人脸检测的问题,以使用 Picasa 所做的人脸检测从包含许多图片的照片中获取个人图片。 Automatic Face detection using API

an answer @Joel Martinez 链接到picasa help 上的答案,其中说:

rect64() 中包含的数字是一个 64 位的十六进制数字。

  • 将其分成四个 16 位数字。
  • 除以最大无符号 16 位数 (65535),您将得到四个 0 到 1 之间的数字。

全文

@oedious 写道:- 这将是 有点技术性,所以请稍等。 * 这 rect64() 中包含的数字是 64 位 十六进制数。 * 打破它 成四个 16 位数字。 * 划分 每个最大无符号 16 位 号码(65535),你将有四个 0 到 1 之间的数字。 * 四个 剩下的数字给你相对 面部矩形的坐标: (左,上,右,下)。 * 如果你 想要以绝对结尾 坐标,多个左侧和 就在图像宽度和顶部 和底部的图像高度。

一个示例 picasa.ini 文件:

[1.jpg]
backuphash=65527
faces=rect64(5520c092dfb2f8d),615eec1bb18bdec5;rect64(dcc2ccf1fd63e93e),bc209d92a3388dc3;rect64(52524b7c785e6cf6),242908faa5044cb3
crop=rect64(0)

如何从 64 位十六进制中获取 4 个数字?

对不起,目前我不明白答案。我想我必须先学习一些 C++(我是一名数学弱点的 PHP 和 Java Web 开发人员),然后才能开始编写一些东西,在一些坐标的帮助下将图像切割成多个图像。我也在调查CodeLabcreating plugins for Paint.net

【问题讨论】:

  • 你用什么语言编写代码?
  • @Rowland Shaw 现在没有。请参阅链接的问题。除了大约 10 年前的一些 VB 之外,我对桌面编程没有任何经验。希望得到一些指导。
  • @Rowland Shaw 我可以做一些 PHP。在这里有用吗?我已经开始悬赏相关问题stackoverflow.com/questions/3872112/…

标签: hex


【解决方案1】:

我需要转换 picasa.ini 文件中的 crop=rect64() 值。 我使用上述信息创建了以下 ruby​​ 方法。

def coordinates(hex_num)
[
  hex_num.divmod(65536)[1],
  hex_num.divmod(65536)[0].divmod(65536)[1],
  hex_num.divmod(65536)[0].divmod(65536)[0].divmod(65536)[1],
  hex_num.divmod(65536)[0].divmod(65536)[0].divmod(65536)[0].divmod(65536)[1]
].reverse
end

它可以工作,但我需要在数组上添加 .reverse 方法才能达到预期的结果。

【讨论】:

    【解决方案2】:

    算法如下:

    除以 0x10000 (65536) 的余数将为您提供第一个数字。

    将结果再除以 0x10000 (65536),余数将为您提供第二个数字。

    将结果再次除以 0x10000 (65536),余数将为您提供第三个数字。

    结果是第四个数字。

    【讨论】:

    • 谢谢。这对我来说是理智的。
    • 如果有人可以解释 0x10000,不胜感激。谢谢!
    • 16 位十六进制数介于 0x0000 和 0xFFFF 之间。如果你有以下数字 0xAAAABBBBCCCCDDDD 并除以 0x10000,结果将是 0xAAAABBBBCCCC,余数将是 0xDDDD。
    【解决方案3】:

    如果你想要基础知识,说你有这个十六进制数字:

    4444333322221111

    我们在纸上将它分成 4 个部分,所以剩下的就是提取它们。这涉及使用ffff 掩码来屏蔽除我们的号码之外的所有其他内容(f 不屏蔽任何内容,0 屏蔽所有内容)并将其滑过每个部分。所以我们有:

    part 1: 4444333322221111 & ffff             = 1111
    part 2: 4444333322221111 & ffff0000         = 22220000
    part 3: 4444333322221111 & ffff00000000     = 333300000000
    part 4: 4444333322221111 & ffff000000000000 = 4444000000000000
    

    剩下的就是删除末尾的 0。总而言之,在 C 中,你可以这样写:

    int GetPart(int64 pack, int n) // where you define int64 as whatever your platform uses
    {                              // __int64 in msvc
      return (pack & (0xffff << (16*n)) >> (16*n);
    }
    

    所以基本上,您将掩码计算为 0xffff(2 个字节)向右移动 16*n 位(第一个为 0,第二个为 16,第三个为 32,第四个为 48),将其应用于数字以屏蔽除我们感兴趣的部分以外的所有内容,然后将结果向后移动 16*n 位以清除最后的那些 0。

    一些补充阅读:Bitwise operators in C.

    希望有帮助!

    【讨论】:

      【解决方案4】:

      我认为您被要求做的是获取您拥有的 64 位数据并将其视为 4 个 16 位整数。从那里您将获取 16 位值并将它们转换为百分比。这些百分比乘以图像的高度/宽度,得到 4 个坐标。

      如何执行此操作取决于您使用的编程语言。

      【讨论】:

        【解决方案5】:

        这取决于语言。对于 C 系列语言,可以这样(在 C# 中)完成:

        UInt64 number      = 0x4444333322221111;
        
        //to get the ones, use a mask
        //                   0x4444333322221111
        const UInt64 mask1 =             0xFFFF; 
        UInt16 part1 = (UInt16)(number & mask1);
        
        //to get the twos, use a mask then shift
        //                   0x4444333322221111
        const UInt64 mask2 =         0xFFFF0000; 
        UInt16 part2 = (UInt16)((number & mask2) >> 16);
        
        //etc.
        //                   0x4444333322221111
        const UInt64 mask3 =     0xFFFF00000000; 
        UInt16 part3 = (UInt16)((number & mask3) >> 32);
        
        //                   0x4444333322221111
        const UInt64 mask4 = 0xFFFF000000000000; 
        UInt16 part4 = (UInt16)((number & mask4) >> 48);
        

        【讨论】:

          【解决方案6】:

          这取决于您的编程语言 - 在 C# 中,即您可以使用 BitConverter 类,它允许您根据字节数组中的字节位置提取数字。

          UInt64 largeHexNumber = 420404334;
          byte[] hexData = BitConverter.GetBytes(largeHexNumber);
          UInt16 firstValue = BitConverter.ToUInt16(hexData, 0);
          UInt16 secondValue = BitConverter.ToUInt16(hexData, 2);
          UInt16 thirdValue = BitConverter.ToUInt16(hexData, 4);
          UInt16 forthValue = BitConverter.ToUInt16(hexData, 6);
          

          【讨论】:

          • 请务必牢记底层架构的字节序。
          猜你喜欢
          • 1970-01-01
          • 2020-03-20
          • 2015-11-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多