从64位十六进制值中获取四个16位数字

时间:2010-10-08 16:18:53

标签: hex

我经历过以下相关问题:

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

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

an answer @Joel Martinezpicasa 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

6 个答案:

答案 0 :(得分:7)

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

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

希望有所帮助!

答案 1 :(得分:1)

这取决于您的编程语言 - 在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);

答案 2 :(得分:1)

这取决于语言。对于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);

答案 3 :(得分:1)

我认为您被要求做的是获取您拥有的64位数据并将其视为4个16位整数。从那里开始,您将获取16位值并将其转换为百分比。当与图像高度/宽度相乘时,这些百分比为您提供4个坐标。

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

答案 4 :(得分:1)

以下是算法:

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

取结果然后再次除以0x10000(65536),余数将给你第二个数字。

再次将结果除以0x10000(65536),余数将给出第三个数字。

结果是第四个数字。

答案 5 :(得分:0)

我需要从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方法以获得所需的结果。