【问题标题】:Objective C equivalent of byte in C#Objective C 相当于 C# 中的字节
【发布时间】:2014-09-13 11:29:44
【问题描述】:

在 C# 中

string p = "help";
byte myByte = (byte)p[1];

In C# byte is a unsigned 8 bit integer (0-255)。如何在 Objective C 中实现同样的目标?

实际需求是,我想将下面用c#编写的代码段转换为objective c。我想不通的部分是字节转换。

static Int64 Encrypt(string p)
{       
    Int64 c = 31;
    for (int i = 0; i < p.Length; i++)            
        c = c * 47 + (byte)p[i] % 97;            

    return c;
}

【问题讨论】:

  • 虽然由于类型的目的我不同意这种用法,但我看到人们使用char作为一个字节。
  • C# 中的 string 由 Unicode 字符 (UTF-16) 组成,而不是字节。你想完成什么?
  • @HABO 查看更新后的问题
  • 请提供示例值。
  • @Zaph 从brkthecode.com获得了代码示例

标签: c# objective-c string char byte


【解决方案1】:

相当于 C#:

注意:所有字符均为 8 位。

int64_t Encrypt(NSString *p) {
    const char *cString = [p cStringUsingEncoding: NSASCIIStringEncoding];

    unsigned long length = strlen(cString);
    int64_t c = 31;
    for (int i = 0; i < length; i++)
        c = c * 47 + cString[i] % 97;

    return c;
}

NSString *p = @"help";
NSLog(@"p: %@", p);

int64_t c = Encrypt(p);
NSLog(@"c: lld", c);

NSLog 输出:

p:帮助
c: 152006240

【讨论】:

  • C# 字符串和 NSString 都使用 Unicode 编码(但不完全相同的字节布局)。 C# 版本仅使用低字节,您的 ObjC 版本会预先更改编码。此版本仅适用于单字节文本输入。
  • @9dan 我清楚地说明了这一点。 OP 还声明“无符号 8 位整数 (0-255)”。但是事情变得非常奇怪,因为几个原因,包括代理对和平面 1 字符(如表情符号),假设 UTF-16。如果您查看我的编辑 4 历史记录,您将看到我关于 unicode 和 ASCII 的初步回答。
  • @9dan 看看 OP 的 web page cited。答案代码为示例案例产生正确的结果:“算盘”-> 334160560256。
  • @Zaph 如果我的评论让您感到不安,我深表歉意。我可能会错误地选择错误的词。只想添加一个关于多字节复杂性的脚注。
  • @9dan 相信我,我并不难过。您的 cmets 是正确的,但不是在这个特定问题的上下文中。 unicode 通常很难理解,并且实现通常不适合代理对和平面 1 字符。
猜你喜欢
  • 2010-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-07
  • 1970-01-01
  • 2018-02-17
相关资源
最近更新 更多