2012-09-16 105 views
0

第二天试图从字节值由0x40的字节十六进制的NSString与缩放0x40的字节

我试图摆脱的Logic Pro/Mackie Control上的十六进制值换算的字符。

逻辑发给我0xE,这表示这是'n'。如果它向我发送'4e',这意味着我应该在显示屏上画'n'。 (只需在最后加点)。

以下是将char转换为字节的公式。请帮我做反之亦然公式。

char translate_seven_segment(char achar) 
{ 
    achar = toupper(achar); 
    if (achar >= 0x40 && achar <= 0x60) 
     return achar - 0x40; 
    else if (achar >= 0x21 && achar <= 0x3f) 
     return achar; 
    else 
     return 0x00; 
} 

char s = 'N'; 
    Byte ad = translate_seven_segment(s) + ('.' == '.' ? 0x40 : 0x00); 

我也发现下面的代码(这似乎没有礼帽()):

def translate_seven_segment(char)      
    case char          
     when 0x40..0x60         
     char - 0x40          
     when 0x21..0x3f          
     char           
     else           
     0x00           
    end           
    end 

我怎样才能扭转这种局面?我知道麦基使用这段代码从char构建十六进制。但我需要反过来,是从十六进制得到char。

+0

你有一堆东西在那里错了。如果传入的值不是UTF8字符,则不应该执行'toUpper' - 它只是简单地处理数据。您应该屏蔽掉40位(与0xBF),然后添加0x40以获得您的基本角色(之后如果您愿意,可以对其进行操作)。并用0x40原始字符来测试'.'指示。 –

+0

这不是我正在做的。这是原始的Mackie代码。我只需要将dex转换为char。我知道麦基似乎使用这个公式。 – user1195202

+0

有些地方你必须找到规格。在我看来,你所拥有的可能是将ASCII转换为7段的代码,而不是其他方式。这是没有意义的'('。'=='。'?0x40:0x00)' - 它总是计算为0x40。 –

回答

1

好的,我看到你添加了关于想要反转序列的注释。如果是这样的话,这很简单:

BOOL haveDot = (the7Segment & 0x40) != 0; 
char temp = the7Segment & 0xBF; 
char theChar = (temp > 0x21) ? temp : (temp + 0x40); 
+0

谢谢,我会试试这个。 – user1195202