如何创建和增加2或3位十六进制数?

时间:2015-03-22 18:11:16

标签: javascript actionscript-3 adobe-indesign

如何从十六进制数组中增加最高十六进制数?我对十六进制的了解有点不稳定所以任何帮助都会受到赞赏。而且说实话,我不知道这些数字是否是十六进制的,因为它们前面有一个“你”,但如果你删除“你”,它们看起来就是这样。值来自InDesign代码段文档。

示例:

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。

3 个答案:

答案 0 :(得分:3)

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

添加2,表示获取此数字的值,并添加值2。 十六进制只是将数字写下来的另一种方式。

您尝试弄清楚这些值是什么的努力受到高度赞赏,但为什么不查看文档以确定?

您拥有与InDesign一起使用的XML。 只是在搜索引发“IDML”,这似乎是Adobe给你试图解析的格式的名称。

Adob​​e提供了描述此格式的文档: 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页上,您可以找到Adobe如何为Self创建值的说明,包括此声明:

  

Self属性值的唯一要求是它   在IDML包中是唯一的。如果您自己编写IDML,   您不需要观察上述模式 - 您可以更改该值   自我属性只要是唯一的就可以得到任何你想要的东西   (在IDML包内)并且只要对元素进行所有引用   也被改为匹配。

答案 1 :(得分:1)

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

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);
}

希望可以提供帮助。

答案 2 :(得分:1)

您标记了JavaScriptActionScript(我不知道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 十进制等值字符。
  • 如果当前数字大于之前存储的 maxNum ,则将数字存储在 maxNum 中。

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

相关问题