3

NSData を 16 進文字列値に変換するための次のコードを試しましたが、すべて間違っていますか?

ここで「結果」は私のNSdataです

出力として16進文字列が必要ですが、それが得られません

NSUInteger dataLength = [result length];
  NSLog(@"%d",dataLength);
    NSMutableString *string = [NSMutableString stringWithCapacity:dataLength*2];
   const unsigned char *dataBytes = [result bytes];
    for (NSInteger idx = 0; idx < dataLength; ++idx) {        [string appendFormat:@"%02x", dataBytes[idx]];
 }    
    NSLog(@"%@",string);

どうすればこれを変換できますか

更新: 結果データには暗号化された文字列が含まれています。これを 16 進数値に変換したい

4

5 に答える 5

14

これは、これを行うためのカテゴリです。これにより、データのすべての文字が16進数で表示されます。改行も何もありません。

@implementation NSData (NSData_Conversion)

#pragma mark - String Conversion
- (NSString *)hexadecimalString
{
    /* Returns hexadecimal string of NSData. Empty string if data is empty.   */

    const unsigned char *dataBuffer = (const unsigned char *)[self bytes];

    if (!dataBuffer)
    {
        return [NSString string];
    }

    NSUInteger          dataLength  = [self length];
    NSMutableString     *hexString  = [NSMutableString stringWithCapacity:(dataLength * 2)];

    for (int i = 0; i < dataLength; ++i)
    {
        [hexString appendFormat:@"%02x", (unsigned int)dataBuffer[i]];
    }

    return [NSString stringWithString:hexString];
}
于 2013-05-13T16:01:19.223 に答える
0

スウィフト 2 バージョン

private let kHexChars = Array("0123456789abcdef".utf8) as [UInt8];

extension NSData {

    public func hexString() -> String {
        guard length > 0 else {
            return ""
        }

        let buffer = UnsafeBufferPointer<UInt8>(start: UnsafePointer(bytes), count: length)
        var output = [UInt8](count: length*2 + 1, repeatedValue: 0)
        var i: Int = 0
        for b in buffer {
            let h = Int((b & 0xf0) >> 4)
            let l = Int(b & 0x0f)
            output[i++] = kHexChars[h]
            output[i++] = kHexChars[l]
        }

        return String.fromCString(UnsafePointer(output))!
    }
}
于 2015-08-13T17:06:32.713 に答える
0

この回答は、Xcode 10 Playground で実行されている Swift 4.2 にあります。

import Foundation

let d = Data(bytes: [0x3f, 0x09, 0x0a, 0xa3, 0x01])
let s:String = d.compactMap({ String(format: "%02x ", $0) }).joined()
print(s)

出力は次のとおりです。

3f 09 0a a3 01 
于 2018-11-14T17:25:25.613 に答える