如何在Python中输出十六进制值而不是字符串或int?

How to output a hex value but not as a string or int in Python?

提问人:Crashzen 提问时间:10/26/2023 最后编辑:Crashzen 更新时间:10/26/2023 访问量:79

问:

我有一个函数(不是我自己的函数),它需要一个格式为 0x****** 的十六进制值作为颜色值。我拥有的函数接受 RGB 值并将它们转换为十六进制,但将其输出为字符串。有没有办法将该字符串评估为十六进制值?

我尝试将十六进制值更改为整数,但该函数似乎不接受整数。

这是我拥有的函数,它接受 RGB 值并将其转换为十六进制。

def decToHexa(n): 
 
    # char array to store hexadecimal number 
    hexaDeciNum = ['0'] * 100
 
    # Counter for hexadecimal number array 
    i = 0
     
    while (n != 0): 
 
        # Temporary variable to store remainder 
        temp = 0
 
        # Storing remainder in temp variable. 
        temp = n % 16
 
        # Check if temp < 10 
        if (temp < 10): 
            hexaDeciNum[i] = chr(temp + 48)
            i = i + 1
 
        else: 
            hexaDeciNum[i] = chr(temp + 55)
            i = i + 1
 
        n = int(n / 16)
 
    hexCode = ""
    if (i == 2):
        hexCode = hexCode + hexaDeciNum[0] 
        hexCode = hexCode + hexaDeciNum[1] 
 
    elif (i == 1): 
        hexCode = "0"
        hexCode = hexCode + hexaDeciNum[0]
 
    elif (i == 0):
        hexCode = "00"
 
    # Return the equivalent 
    # hexadecimal color code 
    return hexCode
 
# Function to convert the 
# RGB code to Hex color code 
def convertRGBtoHex(R, G, B): 
 
    if ((R >= 0 and R <= 255) and
        (G >= 0 and G <= 255) and
        (B >= 0 and B <= 255)): 
 
        hexCode = "0x"; 
        hexCode = hexCode + decToHexa(R)
        hexCode = hexCode + decToHexa(G) 
        hexCode = hexCode + decToHexa(B) 
        return hexCode
 
    # The hex color code doesn't exist 
    else:
        return "-1"

这是使用该值的位置:

def appendCharacter(self,ch,x,y,r,g,b):
        idx = self.numChars
        M = self.metrics[ch]
        self.textData[idx].screenXY = (x << 16) | y
        self.textData[idx].atlasXY = (M["x"]<<16) | M["y"]
        self.textData[idx].ascentDescentWidthLeftBearing = (
                (M["ascent"]<<24)   |
                (M["descent"]<<16)  |
                (M["width"]<<8)     |
                (M["leftbearing"]+128)      #make positive
        )
        self.textData[idx].color = int(convertRGBtoHex(r, g, b).lower(), 0)
        self.numChars+=1

我希望我能提供比这更多的信息,但我拥有的大部分代码都是由我的教授提供的,所以我对它们如何协同工作知之甚少。

Python 十六进制

评论

2赞 Barmar 10/26/2023
“不作为字符串”是什么意思?十进制和十六进制的概念只有在将数字格式化为文本时才有意义。
0赞 Crashzen 10/26/2023
@Barmar 我使用的函数似乎将“0x******”解释为字符串而不是值。很抱歉,我对这个问题的理解不够,无法正确解释。
0赞 Barmar 10/26/2023
如果你把它放在引号里,那么它就是一个字符串。调用不带引号的函数。 它会得到一个数字。func(0x12345)
0赞 Barmar 10/26/2023
很难说出你真正需要什么,因为问题中的细节很少。
0赞 Barmar 10/26/2023
也许你只需要一开始就没有的十六进制字符串?如果没有您正在调用的函数的详细信息,您的问题非常不清楚。0x

答:

2赞 user14232195 10/26/2023 #1

如果函数特别要求格式为 0x****** 的十六进制值,并且不接受整数,则可以将该值保留为整数,但将其格式化为带有“0x”前缀的十六进制字符串。以下是执行此操作的方法:


# Convert your RGB values to an integer (e.g., 0x33FF99)
rgb_int = (red << 16) | (green << 8) | blue

# Format it as a hex string with the "0x" prefix
formatted_hex = f"0x{rgb_int:06X}"

红色、绿色和蓝色代表您的 RGB 值(每个值在 0-255 范围内)。

rgb_int是通过将这些值移位并组合成格式为 0xRRGGBB 的单个整数来构造的。

f“0x{rgb_int:06X}” 将 rgb_int 格式设置为带有“0x”前缀且至少 6 个字符的字符串,因此它遵循 0x****** 格式。

尝试在函数中使用 rgb_int 作为参数。

评论

0赞 Barmar 10/26/2023
他们说他们不想要字符串,所以我怀疑他们真的需要.rgb_int
0赞 bigg-S 10/26/2023 #2

您可以尝试使用 python 中的 int() 方法将字符串转换为十六进制。 像这样的东西:

hex_value = int("the returned hex string", 16)

第二个参数是结果(十六进制)的基数 这将为您提供十六进制的值

评论

0赞 Crashzen 10/26/2023
hex_value是实际值还是格式化为十六进制值的字符串?此外,我需要它作为十六进制值,而不是表示十六进制值的整数。
0赞 Crashzen 10/26/2023
现在我看了一下,我以前试过这样做,但它将其转换为函数(由于某种原因)无法正常工作的 int。
0赞 bigg-S 10/26/2023
int() 方法返回一个具有指定 base(int() 方法的第二个参数)的值。该值应为十六进制,但很可能不是您需要的格式。
0赞 OysterShucker 10/26/2023 #3

你可以用这个替换你的整个功能decToHexa

#08x = (0) pad (8) positions he(x)adecimal
hxd = f'0x{n:08x}'

转换回 int

#convert to int using base 16
i = int(hxd, 16)

需要注意的一点:您似乎认为它必须采用十六进制格式才能使用位移。您可以对任何 int.十六进制格式只是一种轻松表示数字概念的方法。这是您位移的实际数字,而不是概念表示。换句话说,您根本不需要将其转换为十六进制,除非您正在使用的东西需要该格式(即通常是 RGBA 值)。