如何创建和递增2或3位十六进制数字

How do I create and increment a 2 or 3 digit hexadecimal number?

本文关键字:3位 十六进制数字 何创建 创建      更新时间:2023-09-26

如何从十六进制数数组中递增最高的十六进制数?我对十六进制的了解有点参差不齐,所以如果有任何帮助,我们将不胜感激。老实说,我不知道这些数字是否是十六进制的,因为它们前面有一个"u",但如果去掉"u"的话,它们看起来是这样的。这些值来自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 web颜色,如"0xFF0000"(红色),但不同之处在于它使用了2或3个字符,而不是6个字符,例如"ufc"或"u112"。

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

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

加2意味着取这个数字的值,再加上2的值。十六进制只是写数字的另一种方式。

我们非常感谢您努力弄清楚这些值是什么,但为什么不检查文档以确定呢?

您有一个与InDesign一起收到的XML。仅仅搜索一下就向我抛出了"IDML",这似乎是Adobe给你试图解析的格式起的名字。

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

第10.1.1节是关于自我属性:

Self属性包含元素的唯一标识符包含它。此标识符在IDML包的其他地方用于引用元素,如"对象引用"中所述格式"部分。架构示例2。自属性Self{xsd:string}

正如您所看到的,该值是一个字符串,而不是一个数字。

在第31页上,您可以找到Adobe如何为Self创建值的描述,包括以下语句:

Self属性值的唯一要求是在IDML包中是唯一的。如果您自己编写IDML,您不需要遵守上面的模式--您可以更改值"自"属性的值,只要它是唯一的即可(在IDML包中),只要所有对元素的引用也更改为匹配。

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

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

希望这能有所帮助。

您标记了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")。