【问题标题】:Hex to NSString with scaling 0x40 bytes十六进制到 NSString 缩放 0x40 字节
【发布时间】:2012-09-08 23:59:19
【问题描述】:

第二天尝试从缩放 0x40 字节的字节值中获取字符

我正在尝试从 Logic Pro/Mackie Control 获取十六进制值。

Logic 向我发送 0xE,这意味着这是“n”。如果它向我发送“4e”,则意味着我应该在显示屏上绘制“n”。 (只需在末尾添加点)。

这是将 char 转换为 byte 的公式。请帮我制作反之亦然的公式。

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

我还发现了以下代码(这似乎没有 topper()):

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

我怎样才能扭转它?我知道 mackie 使用此代码从 char 构建十六进制。但我需要反之亦然,就是从十六进制中获取字符。

【问题讨论】:

  • 你搞错了一堆东西。如果传入的值不是 UTF8 字符,则不应执行 toUpper ——它只会使数据出现乱码。您应该屏蔽 40 位(AND 与 0xBF),然后添加 0x40 以获得您的基本字符(之后您可以根据需要执行 toUpper)。 AND 带有 0x40 的原始字符以测试 . 指示。
  • 这不是我做的。这是原始的 Mackie 代码。我只需要将 dex 转换为 char。我知道 Mackie 似乎使用了这个公式。
  • 你必须在某个地方找到规格。在我看来,您所拥有的可能是将 ASCII 转换为 7 段的代码,而不是相反。这毫无意义( '.' == '.' ? 0x40 : 0x00 )——它总是会计算为 0x40。

标签: nsstring char hex byte


【解决方案1】:

好的,我看到你添加了关于想要颠倒顺序的注释。如果是这样,那就很简单了:

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

【讨论】:

    猜你喜欢
    • 2011-01-30
    • 2015-04-06
    • 1970-01-01
    • 2017-09-13
    • 2015-08-08
    • 2023-03-14
    • 1970-01-01
    • 2012-01-24
    相关资源
    最近更新 更多