【问题标题】:IOS:Convert string to hexadecimal arrayIOS:将字符串转换为十六进制数组
【发布时间】:2015-02-26 07:43:26
【问题描述】:

我有代表数据的字符串。我需要将这些数据转换为十六进制数组。通过使用十六进制数组数据,我可以将其传递给 CRC 以写入外围设备

我的字符串数据是这样的

          NSString *stringsdata=@"helloworld1234567812345q";

我需要转换成十六进制格式的数组,比如

       {0x0h,0x0e............0x0q}. 

所以通过使用这个数组,我可以将数据保存在 crc 中并将其写入外围数据

            Byte comm[24];
            comm[0]=0x01;
            comm[1]=0x30;
            comm[2]=0x62;
            comm[3]=0x00;................

已经尝试了许多可能的解决方案,但没有运气。任何身体帮助将不胜感激。

【问题讨论】:

  • 0x0h, 0x0q 不是十六进制数字。您需要更清楚自己正在尝试什么,并展示您尝试过的代码并说明它为什么不起作用 - 这样人们将有更好的机会帮助您。

标签: ios objective-c nsstring hex core-bluetooth


【解决方案1】:

Byte[] 类是一个字符数组。我的意思是你只能在它的索引处设置一个字符。

如果我们有

Byte comm[24]; 然后comm[0]=0x01; 在这里看起来很混乱,因为它只保存一个字符。

声明将类似于comm[0]='x';

下面的代码将从给定的字符串创建Byte[]

NSString *stringsdata=@"helloworld1234567812345q";
    CFStringRef cfString = (__bridge CFStringRef)stringsdata;
    char *array = charArrayFromCFStringRef(cfString);
    size_t length= strlen(array);

    Byte comm[24];
    for (int i = 0; i < length; i++) {
        comm[i] = array[i];
    }

转换函数:

char * charArrayFromCFStringRef(CFStringRef stringRef) {
    if (stringRef == NULL) {
        return NULL;
    }

    CFIndex length = CFStringGetLength(stringRef);
    CFIndex maxSize = CFStringGetMaximumSizeForEncoding(length, kCFStringEncodingUTF8);

    char *buffer = (char *)malloc(maxSize);
    if (CFStringGetCString(stringRef, buffer, maxSize, kCFStringEncodingUTF8)) {
        return buffer;
    }
    return NULL;
}

输出:

Printing description of comm:
(Byte [24]) comm = {
  [0] = 'h'
  [1] = 'e'
  [2] = 'l'
  [3] = 'l'
  [4] = 'o'
  [5] = 'w'
  [6] = 'o'
  [7] = 'r'
  [8] = 'l'
  [9] = 'd'
  [10] = '1'
  [11] = '2'
  [12] = '3'
  [13] = '4'
  [14] = '5'
  [15] = '6'
  [16] = '7'
  [17] = '8'
  [18] = '1'
  [19] = '2'
  [20] = '3'
  [21] = '4'
  [22] = '5'
  [23] = 'q'
}

这里的问题是,如果您仍然转换来自 Byte[] 的任何字符,那么您只能在任何索引处保存一个字符。

由于以上字符的十六进制值多于一个字符,Byte[]中只能保存一个字符。

我建议使用NSArray将每个字符的十六进制值保存为NSString格式。

【讨论】:

  • 您的代码在malloc 中显示为charArrayFromCFStringRef 中的缓冲区,返回该缓冲区,将其复制到本地数组,然后丢弃malloc'ed 缓冲区而不使用free'ing .
【解决方案2】:

A.十六进制格式只是相同数据的另一种表示形式。

B.您不会将它们转换为十六进制数组。每个字符都有一个数字。例如,在 ASCII 和 UTF-8 中,A 的数字为 65(十进制表示)。这是十六进制表示的 0x41。

'A' (ASCII) == 65 == 0x41。

一个十六进制数有0-9a-f这几个数字,其中a的值是10,b的值是11……转换成十进制表示通过将高位数字乘以 16 并添加低位数字。 (0x41:4 x 16 + 1 = 65。)

请阅读并理解这一点:http://en.wikipedia.org/wiki/Hexadecimal

C.要将字符串转换为其数字,您必须知道要应用哪个代码。可能您想使用 UTF-8。

NSString *text = @"helloworld123123989128739";
NSUInteger length = [text lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
char data[length];
[text getCString:data maxLength:length usingEncoding:NSUTF8StringEncoding];
// Here we go

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 2013-02-07
    • 2014-03-19
    相关资源
    最近更新 更多