【问题标题】:How do I create and increment a 2 or 3 digit hexadecimal number?如何创建和递增 2 位或 3 位十六进制数?
【发布时间】:2015-03-22 18:11:16
【问题描述】:

如何从十六进制数字数组中增加最高的十六进制数字?我对十六进制的了解有些参差不齐,因此将不胜感激。老实说,我不知道这些数字是否是十六进制的,因为它们前面有一个“u”,但如果你去掉“u”,它们看起来就是这样。这些值来自 InDesign sn-p 文档。

例子:

var anArray = ["uf9","ufc","u111","u112","u136","u137"]; // actual values

var getUniqueID = getNextHigherNumber(anArray);

function getNextHigherNumber(anArray) {
   // sort array
   // create variable and add one
   // return variable 
   return variable;
}

来自服务器的 XML(查看 Self 和 Source):

<Hyperlink Self="ufc" Name="is a  multiline hyperlink that terminates here" Source="uf9" Visible="false" Highlight="None" Width="Thin" BorderStyle="Solid" Hidden="false" DestinationUniqueKey="1">
    <Properties>
        <BorderColor type="enumeration">Black</BorderColor>
        <Destination type="object">HyperlinkURLDestination/http%3a//test.com#1stMultilineLink/</Destination>
    </Properties>
</Hyperlink>
<Hyperlink Self="u112" Name="hyperlink inline" Source="u111" Visible="false" Highlight="None" Width="Thin" BorderStyle="Solid" Hidden="false" DestinationUniqueKey="2">
    <Properties>
        <BorderColor type="enumeration">Black</BorderColor>
        <Destination type="object">HyperlinkURLDestination/http%3a//test.com</Destination>
    </Properties>
</Hyperlink>
<Hyperlink Self="u137" Name="another multline hyperlink" Source="u136" Visible="false" Highlight="Outline" Width="Thick" BorderStyle="Solid" Hidden="false" DestinationUniqueKey="3">
    <Properties>
        <BorderColor type="enumeration">Purple</BorderColor>
        <Destination type="object">HyperlinkURLDestination/http%3a//google.com#multilinehyperlink</Destination>
    </Properties>
</Hyperlink>

更多背景:

我有一个现有的 XML 文档,看起来它的 ID 使用十六进制数字系统,我需要能够为新节点创建一个唯一 ID。 ID 值看起来类似于 HTML 网页颜色,例如“0xFF0000”(红色),但不同之处在于它使用 2 或 3 个字符而不是 6 个字符,例如“ufc”或“u112”。

我从服务器收到一个 XML 文件,它有节点,每个节点都有一个具有唯一值的 ID(参见上面的 XML 示例)。如果我必须创建一个新的“项目”,我需要为其创建一个尚未使用的唯一 ID。

【问题讨论】:

    标签: javascript actionscript-3 adobe-indesign


    【解决方案1】:

    首先,十六进制只是数字的表示。 数字本身保持不变。

    加2,意思是取这个数的值,加上2的值。 十六进制只是记下数字的另一种方式。

    我们非常感谢您尝试找出这些值是什么,但为什么不查看文档以明确了解?

    您有一个通过 InDesign 收到/从 InDesign 收到的 XML。 只是搜索会向我抛出“IDML”,这似乎是 Adob​​e 为您尝试解析的格式命名的名称。

    Adobe 提供了描述这种格式的文档: https://wwwimages2.adobe.com/content/dam/Adobe/en/devnet/indesign/cs55-docs/IDML/idml-specification.pdf

    10.1.1 节是关于 Self 属性的:

    Self 属性包含元素的唯一标识符 包含它。此标识符在 IDML 包中的其他位置用于 引用元素,如“对象参考”中所述 本规范的“格式”部分。架构示例 2。 自属性 Self { xsd:string }

    如您所见,该值是字符串,而不是数字。

    在第 31 页,您可以找到有关 Adob​​e 如何为 Self 创建价值的说明,包括以下声明:

    Self 属性值的唯一要求是它是 在 IDML 包中是唯一的。如果您自己编写 IDML, 你不需要遵守上面的模式——你可以改变值 只要它是唯一的,你想要的任何东西都可以使用 Self 属性 (在 IDML 包中)并且只要对元素的所有引用 也改为匹配。

    【讨论】:

      【解决方案2】:

      我认为你在考虑十六进制时会使事情复杂化;)你可以将你的十六进制值转换为十进制值,然后继续你正在做的事情,所以你可以这样做:

      var anArray = ['u112', 'u136', 'uf9', 'u137', 'u111', 'ufc'];
      
      var getUniqueID = getNextHigherNumber(anArray);
      
      trace('u', getUniqueID);    // gives : u138
      
      function getNextHigherNumber(anArray:Array):String {
          var max:int = 0;
          for(var i:int = 0; i<anArray.length; i++){
              // convert the hex value to an integer
              var num:int = int('0x' + String(anArray[i]).substr(1)); 
              // get the max value    
              if(num > max) max = num;
          }
          // return the hex value of (max value + 1)
          return (max + 1).toString(16);
      }
      

      希望能有所帮助。

      【讨论】:

        【解决方案3】:

        您标记了JavaScript 和ActionScript(我不知道ActionScript),但是您问题中的代码对我来说看起来像JavaScript,而这里的另一个答案看起来像是在ActionScript 中;所以,假设你仍然想这样做(看起来用户 null 正在做某事),我将发布 JavaScript 等价物:

        var anArray = ["uf9","ufc","u111","u112","u136","u137"];
        
        function getNextHigherNumber(theArray) {
            var maxNum = 0;
            theArray.forEach(function(num) {
                num = parseInt(num.substr(1), 16);
                if(num > maxNum) maxNum = num;
            });
            return 'u' + (maxNum + 1).toString(16);
        }
        
        // Run the function to see if it works
        console.log(getNextHigherNumber(anArray));
        

        它在 forEach 函数/循环中做了什么:

        • 从每个数组元素中删除“u”。
        • 将不带“u”的字符串转换为其等效的int十进制。
        • 如果当前数字大于之前存储的 ma​​xNum,则将数字存储在 ma​​xNum 中。

        然后它 returns 是最大的数字加一,通过 .toString(16) 再次转换回十六进制(并在其前面加上一个 'u')。

        【讨论】:

        • 谢谢。 ActionScript 3 类似于 JavaScript,但可以选择使用强类型、类和包。如果您了解 JavaScript,您可以在同一天开始使用 AS3,并且您可以在一两天内掌握 AS3 的新功能。
        • 很高兴知道,是的,我注意到另一个回复中 ActionScript 答案中的类型。我刚刚读了一点,ActionScript 现在实际上是 ECMAScript(JavaScript 规范)的“方言”。这是一个有趣的事实,谢谢。关于您的问题,您最终会为您的 XML 节点分配一个任意 ID 吗?只是好奇,真的。
        • 我使用该函数将文档中的所有ID转换为整数,它们都是按顺序排列的!所以在这种情况下它使用十六进制。尽管规范说您可以使用任何值,但我将跟随他们的领导,因此我从 ID 中获取最高值,添加一个然后将其用作新 ID。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-08
        • 2012-05-01
        • 2012-07-12
        • 2018-08-26
        • 2014-11-20
        • 1970-01-01
        • 2020-01-13
        相关资源
        最近更新 更多