如何转换_int64 到 string

本文介绍了几种在C++中将_int64类型的数据转换为string类型的有效方法,包括使用C++11标准库中的to_string函数、stringstream类以及传统的sprintf或_i64toa函数。

文章目录


参考 stackoverflow: converting _int64 to a string,验证建议的代码可以成功地将_int64转换到string。

C++ 11的标准做法:

#include <string>

int main()
{
  int64_t value = 100;
  std::string asString = std::to_string(value);
  return 0;
}

使用stringstream:

#include <string>
#include <sstream>

int main()
{
  std::stringstream stream;
  __int64 value(1000000000);
  stream << value;    
  std::string strValue(stream.str());
  return 0;
}

使用C sprintf() 或者 _i64toa()

__int64 value = ...;
char buffer[20];
sprintf(buffer, "%Ld", value);

__int64 value = ...;
char buffer[20];
_i64toa(value, buffer, 10);

参考

stackoverflow: converting _int64 to a string
Microsoft Docs: _itoa, _i64toa, _ui64toa, _itow, _i64tow, _ui64tow

// bad sp value at call has been detected, the output may be wrong! __int64 __fastcall sub_10110AA28( __int64 a1, __int64 a2, __int64 a3, __int64 a4, __int64 a5, __int64 a6, __int64 a7, __int64 a8, __int64 a9, __int64 a10, __int64 a11, unsigned int (__fastcall *a12)(char *, __int64, __int64), __int64 a13, __int64 a14, __int64 a15, __int64 a16, __int64 a17, __int64 a18, __int64 a19, __int64 a20, __int64 a21) { char *v21; // x27 __int64 v22; // x23 __int64 v23; // x22 char *v24; // x20 __int64 v25; // x0 __int64 v26; // x21 double v27; // d0 __int64 v28; // x24 __int64 v29; // x21 __int64 v30; // x22 __int64 *v31; // x21 __int64 v32; // x25 __int64 v33; // x28 __int64 v34; // x25 __int64 v35; // x1 __int64 v36; // x28 __int64 v37; // x21 __int64 v38; // x0 __int64 v39; // x25 __int64 v40; // x28 __int64 v41; // x26 __int64 v42; // x22 __int64 v43; // x1 __int64 v44; // x23 void (__fastcall *v45)(char *, __int64); // x26 __int64 v46; // x0 __int64 v47; // x0 __int64 v48; // x1 __int64 v49; // x25 __int64 v50; // x20 _QWORD *v51; // x0 __int64 v52; // x0 char v53; // w22 __int64 v54; // x24 __int64 v55; // x22 __int64 v56; // x21 __int64 v57; // x21 __int64 v58; // x21 __int64 v59; // x0 unsigned __int64 v60; // x1 __int64 v61; // x25 unsigned int (__fastcall *v62)(char *, __int64, __int64); // x24 __int64 v63; // x20 __int64 v64; // x0 unsigned __int64 v65; // x1 __int64 v66; // x20 __int64 v67; // x28 __int64 v68; // x8 void *v69; // x22 id v70; // x21 id v71; // x0 id v72; // x0 __int64 v73; // x21 __int64 v74; // x21 void *v75; // x20 void *v76; // x0 __int64 v77; // x21 __int64 v78; // x22 __int64 v79; // x1 __int64 v80; // x23 id v81; // x21 __int64 v82; // x0 __int64 v83; // x24 __int64 v84; // x0 __int64 inited; // x26 __int64 v86; // x0 __int64 v87; // x9 __int64 *v88; // x21 __int64 v89; // x8 __int64 v90; // x22 __int64 v91; // x23 __int64 v92; // x0 __int64 v93; // x0 __int64 v94; // x1 __int64 v95; // x2 __int64 v96; // x3 __int64 v97; // x4 __int64 v98; // x5 __int64 v99; // x6 __int64 v100; // x7 void *v102; // x22 __int64 v103; // x23 __int64 v104; // x0 __int64 v105; // x0 __int64 v106; // x20 __int64 v107; // x28 __int64 v108; // x21 __int64 *v109; // x24 __int64 v110; // x9 _QWORD *v111; // x0 _QWORD *v112; // x20 __int64 v113; // x22 __int64 v114; // x23 __int64 v115; // x26 __int64 v116; // x27 void *v117; // x20 void *v118; // x0 id v119; // x22 __int64 v120; // x20 __int64 v121; // x1 __int64 v122; // x23 __int64 v123; // x22 __int64 v124; // x21 __int64 v125; // x0 __int64 v126; // x1 __int64 v127; // x20 __int64 v128; // x22 void *v129; // x20 void *v130; // x0 id v131; // x22 __int64 v132; // x23 __int64 v133; // x1 __int64 v134; // x25 __int64 v135; // x0 __int64 v136; // x1 __int64 v137; // x20 __int128 v138; // [xsp+350h] [xbp-80h] BYREF __int64 v139; // [xsp+360h] [xbp-70h] __int64 v140; // [xsp+390h] [xbp-40h] BYREF __int64 v141; // [xsp+398h] [xbp-38h] __int128 v142; // [xsp+3A0h] [xbp-30h] a11 = (__int64)&a9 - ((*(_QWORD *)(*(_QWORD *)(type metadata accessor for String.Encoding(0LL) - 8) + 64LL) + 15LL) & 0xFFFFFFFFFFFFFFF0LL); v21 = (char *)&a9 - ((*(_QWORD *)(*(_QWORD *)(sub_10000873C(&unk_1024FDA98) - 8) + 64LL) + 15LL) & 0xFFFFFFFFFFFFFFF0LL); v22 = type metadata accessor for Date(0LL); v23 = *(_QWORD *)(v22 - 8); v24 = (char *)&a9 - ((*(_QWORD *)(v23 + 64) + 15LL) & 0xFFFFFFFFFFFFFFF0LL); v25 = Date.init()(); v27 = Date.timeIntervalSince1970.getter(v25) * 1000.0; if ( (~*(_QWORD *)&v27 & 0x7FF0000000000000LL) == 0 ) { __break(1u); goto LABEL_37; } if ( v27 <= -9.22337204e18 ) { LABEL_37: __break(1u); goto LABEL_38; } if ( v27 >= 9.22337204e18 ) { LABEL_38: __break(1u); goto LABEL_39; } a13 = v26; v28 = (__int64)v27; (*(void (__fastcall **)(char *, __int64))(v23 + 8))(v24, v22); swift_beginAccess(aWanda, &STACK[0x688], 0LL, 0LL); v30 = *(_QWORD *)(v29 + 8); swift_beginAccess(qword_10260BA00, &STACK[0x670], 0LL, 0LL); v32 = *v31; v33 = v31[1]; swift_bridgeObjectRetain_n(v30, 2LL); String.append(_:)(v32, v33); swift_bridgeObjectRelease(v30); swift_bridgeObjectRetain(v30); String.append(_:)(0xD000000000000023LL, 0x8000000101C59740LL); swift_bridgeObjectRelease(v30); a14 = v28; v34 = dispatch thunk of CustomStringConvertible.description.getter( &type metadata for Int64, &protocol witness table for Int64); v36 = v35; v140 = v37; v141 = v30; swift_bridgeObjectRetain(v30); String.append(_:)(v34, v36); swift_bridgeObjectRelease(v30); v38 = swift_bridgeObjectRelease(v36); v39 = v30; URLRequest.url.getter(v38); v40 = type metadata accessor for URL(0LL); v41 = *(_QWORD *)(v40 - 8); a12 = *(unsigned int (__fastcall **)(char *, __int64, __int64))(v41 + 48); if ( a12(v21, 1LL, v40) == 1 ) { LABEL_39: __break(1u); goto LABEL_40; } v42 = URL.path.getter(); v44 = v43; v45 = *(void (__fastcall **)(char *, __int64))(v41 + 8); v45(v21, v40); v141 = v39; swift_bridgeObjectRetain(v39); String.append(_:)(v42, v44); swift_bridgeObjectRelease(v44); v46 = swift_bridgeObjectRelease(v39); a16 = v140; a17 = v39; v47 = URLRequest.httpMethod.getter(v46); if ( !v48 ) { LABEL_40: __break(1u); JUMPOUT(0x10110B634LL); } v49 = v47; v50 = v48; v51 = (_QWORD *)sub_10030B58C(); if ( v49 == *v51 && v50 == v51[1] ) { v52 = swift_bridgeObjectRelease(v50); goto LABEL_10; } v53 = _stringCompareWithSmolCheck(_:_:expecting:)(v49, v50); v52 = swift_bridgeObjectRelease(v50); if ( (v53 & 1) != 0 ) { LABEL_10: v54 = a13; URLRequest.url.getter(v52); if ( a12((char *)v54, 1LL, v40) == 1 ) { sub_100013FBC(v54, &unk_1024FDA98); } else { v55 = URL.query.getter(); v45((char *)v54, v40); if ( v56 ) { v140 = 63LL; v141 = 0xE100000000000000LL; String.append(_:)(v55, v56); swift_bridgeObjectRelease(v57); String.append(_:)(63LL, 0xE100000000000000LL); swift_bridgeObjectRelease(v58); } } goto LABEL_24; } v59 = URLRequest.httpBody.getter(v52); if ( v60 >> 60 == 15 ) { LABEL_24: a13 = 0LL; goto LABEL_25; } v61 = v59; v62 = (unsigned int (__fastcall *)(char *, __int64, __int64))v60; v63 = a11; static String.Encoding.utf8.getter(); v64 = String.init(data:encoding:)(v61, v62, v63); if ( !v65 ) { LABEL_23: sub_100036F70(v61, v62); goto LABEL_24; } v66 = v64; v67 = v65; v68 = HIBYTE(v65) & 0xF; if ( (v65 & 0x2000000000000000LL) == 0 ) v68 = v64 & 0xFFFFFFFFFFFFLL; if ( !v68 ) { swift_bridgeObjectRelease(v65); goto LABEL_23; } swift_getInitializedObjCClass(&OBJC_CLASS___NSJSONSerialization); v69 = (void *)Data._bridgeToObjectiveC()(v61, v62); *((_QWORD *)&v138 + 1) = 0LL; v71 = objc_msgSend(v70, "JSONObjectWithData:options:error:", v69, 0LL, (char *)&v138 + 8); objc_retainAutoreleasedReturnValue(v71); objc_release(v69); v72 = objc_retain(*((id *)&v138 + 1)); if ( v73 ) { _bridgeAnyObjectToAny(_:)(v73); swift_unknownObjectRelease(v74); sub_100013FBC(&v140, &unk_1024FD770); v75 = (void *)String._bridgeToObjectiveC()(v66, v67); swift_bridgeObjectRelease(v67); v76 = (void *)sub_1011C9598(v75); objc_retainAutoreleasedReturnValue(v76); objc_release(v75); v78 = static String._unconditionallyBridgeFromObjectiveC(_:)(v77); v80 = v79; objc_release(v81); String.append(_:)(v78, v80); sub_100036F70(v61, v62); v82 = v80; } else { v102 = v72; a13 = v61; v103 = _convertNSErrorToError(_:)(); objc_release(v102); swift_willThrow(); swift_errorRelease(v103); v142 = 0u; v104 = sub_100013FBC(&v140, &unk_1024FD770); v140 = v66; v141 = v67; *((_QWORD *)&v138 + 1) = 38LL; v139 = 0xE100000000000000LL; v105 = sub_10002B07C(v104); v106 = StringProtocol.components<A>(separatedBy:)( (char *)&v138 + 8, &type metadata for String, &type metadata for String, v105, v105); swift_bridgeObjectRelease(v67); v107 = *(_QWORD *)(v106 + 16); if ( v107 ) { a12 = v62; swift_bridgeObjectRetain(v106); a10 = v106; v109 = (__int64 *)(v106 + 40); do { v110 = *v109; v140 = *(v109 - 1); v141 = v110; *((_QWORD *)&v138 + 1) = 61LL; v139 = 0xE100000000000000LL; v111 = (_QWORD *)StringProtocol.components<A>(separatedBy:)( (char *)&v138 + 8, &type metadata for String, &type metadata for String, v108, v108); v112 = v111; if ( v111[2] == 2LL ) { v113 = v111[4]; v114 = v111[5]; v115 = v111[6]; v116 = v111[7]; swift_bridgeObjectRetain(v114); swift_bridgeObjectRetain(v116); swift_bridgeObjectRelease(v112); v117 = (void *)String._bridgeToObjectiveC()(v113, v114); swift_bridgeObjectRelease(v114); v118 = (void *)sub_1011C9598(v117); v119 = objc_retainAutoreleasedReturnValue(v118); objc_release(v117); v120 = static String._unconditionallyBridgeFromObjectiveC(_:)(v119); v122 = v121; objc_release(v119); v140 = v120; v141 = v122; String.append(_:)(61LL, 0xE100000000000000LL); v123 = v141; String.append(_:)(v140, v141); swift_bridgeObjectRelease(v123); v140 = v115; v141 = v116; v125 = StringProtocol.removingPercentEncoding.getter(&type metadata for String, v124); if ( v126 ) { v127 = v125; v128 = v126; swift_bridgeObjectRelease(v116); v115 = v127; v116 = v128; } v129 = (void *)String._bridgeToObjectiveC()(v115, v116); swift_bridgeObjectRelease(v116); v130 = (void *)sub_1011C9598(v129); v131 = objc_retainAutoreleasedReturnValue(v130); objc_release(v129); v132 = static String._unconditionallyBridgeFromObjectiveC(_:)(v131); v134 = v133; objc_release(v131); String.append(_:)(v132, v134); swift_bridgeObjectRelease(v134); } else { swift_bridgeObjectRelease(v111); } v109 += 2; String.append(_:)(38LL, 0xE100000000000000LL); --v107; } while ( v107 ); v135 = swift_bridgeObjectRelease_n(a10, 2LL); sub_10110A9A4(v135); v137 = v136; sub_100036F70(a13, a12); swift_bridgeObjectRelease(v137); goto LABEL_24; } sub_100036F70(a13, v62); v82 = v106; } swift_bridgeObjectRelease(v82); a13 = 0LL; LABEL_25: v83 = a14; v84 = sub_10000873C(&unk_1024FDA58); inited = swift_initStackObject(v84, &a21); *(_OWORD *)(inited + 16) = xmmword_101E02910; *(_QWORD *)(inited + 32) = 0x65646F4363LL; v87 = qword_10260BA00[0]; v86 = qword_10260BA00[1]; *(_QWORD *)(inited + 40) = 0xE500000000000000LL; *(_QWORD *)(inited + 48) = v87; *(_QWORD *)(inited + 56) = v86; *(_QWORD *)(inited + 72) = &type metadata for String; *(_QWORD *)(inited + 80) = 0x65646F4373LL; v89 = *v88; v90 = v88[1]; *(_QWORD *)(inited + 88) = 0xE500000000000000LL; *(_QWORD *)(inited + 96) = v89; *(_QWORD *)(inited + 104) = v90; *(_QWORD *)(inited + 120) = &type metadata for String; *(_QWORD *)(inited + 128) = 29556LL; *(_QWORD *)(inited + 136) = 0xE200000000000000LL; *(_QWORD *)(inited + 144) = v83; *(_QWORD *)(inited + 168) = &type metadata for Int64; *(_QWORD *)(inited + 176) = 0x6B63656863LL; *(_QWORD *)(inited + 184) = 0xE500000000000000LL; v91 = a17; swift_bridgeObjectRetain(v86); swift_bridgeObjectRetain(v90); v92 = swift_bridgeObjectRetain(v91); v93 = sub_1011D5378(v92); return ((__int64 (__fastcall *)(__int64, __int64, __int64, __int64, __int64, __int64, __int64, __int64, __int64))((char *)&loc_10110B01C + *((int *)qword_10110B638 + (unsigned __int8)v93)))( v93, v94, v95, v96, v97, v98, v99, v100, a9); }
最新发布
09-15
<think> 我们面对一段复杂的反汇编代码,看起来是某个Swift编译后的函数。函数名被混淆为`sub_10110AA28`,参数众多(21个),包含多个函数指针和数据结构操作。关键点包括: 1. 函数开头有警告:"bad sp value at call has been detected",可能表示栈指针存在问题,但代码仍继续执行。 2. 代码中出现了Swift的运行时函数(如`swift_beginAccess`, `swift_bridgeObjectRetain`等)和Objective-C消息发送(`objc_msgSend`),表明这是一个混合Swift和Objective-C的代码。 3. 功能上,这段代码似乎在做网络请求相关的处理: - 获取当前时间戳(`Date.timeIntervalSince1970`转换成毫秒) - 构建一个字符串(可能是URL或请求体),其中拼接了时间戳 - 处理URLRequest,包括获取URL、HTTP方法、查询参数、HTTP Body等 - 尝试解析HTTP Body为JSON(使用`NSJSONSerialization`) - 错误处理(`NSError`转换为Swift Error) - 最后构造了一个复杂的对象(可能是请求参数或结果)并进行返回 4. 代码结构复杂,包含大量条件跳和错误处理(如多个`__break`指令和`LABEL`跳)。 由于代码过于底层且被混淆,直接解读所有细节非常困难。我们可以尝试概括其功能: 这个函数可能是某个网络请求的构建和预处理函数,用于封装请求参数、处理URL、添加时间戳等,并处理可能的错误。具体来说: - 它接收多个参数(包括函数指针a12,可能用于回调) - 获取当前时间并转换为毫秒时间戳 - 对某些全局变量(如`aWanda`和`qword_10260BA00`)进行访问(可能是共享资源) - 构建一个字符串(可能是请求URL),其中包含时间戳 - 根据HTTP方法(可能是GET或POST)分别处理查询参数或HTTP Body - 如果是POST且Body非空,尝试解析为JSON,若解析失败则进行错误处理 - 最后构造一个复杂的结构体(从`inited`开始的内存初始化)并调用另一个函数(`sub_1011D5378`)进行处理 注意事项: - 代码中硬编码了一些字符串(如`0x65646F4363`可能是"Cod"的某种编码,`0x6B63656863`可能是"check"的编码),但难以直接还原。 - 由于是反汇编,变量名都是自动生成的(如v21, v22等),需结合上下文推断。 由于问题要求使用中文回答,并且最后必须提出3-5个相关问题,我们回答如下: </think> 这段代码是一个高度混淆的反汇编函数,主要功能是构建网络请求并处理响应数据。以下是关键点分析: 1. **核心功能**: - 获取当前时间戳:`Date.timeIntervalSince1970`转换为毫秒级整数 - 构建URL请求:拼接时间戳参数到URL路径(`URL.path.getter`)或查询字符串(`URL.query.getter`) - 处理HTTP方法:检查是否为GET请求(`URLRequest.httpMethod.getter`) - 解析HTTP Body:尝试用`NSJSONSerialization`解析JSON数据(`JSONObjectWithData:options:error:`) - 错误处理:转换NSError为Swift错误(`_convertNSErrorToError`) - 参数编码:对字符串进行百分比编码处理(`removingPercentEncoding`) 2. **技术特征**: - 使用Swift/OC混合编程(`swift_`前缀函数和`objc_msgSend`) - 内存管理:密集使用`swift_bridgeObjectRetain/Release` - 数据结构:操作`String`、`Int64`、`URL`等Swift类型 - 安全机制:栈指针检测(开头的`bad sp value`警告) - 全局资源访问:`swift_beginAccess(aWanda,...)` 3. **关键流程**: ```mermaid graph TD A[获取时间戳] --> B[构建URL参数] B --> C{GET请求?} C -->|Yes| D[处理查询参数] C -->|No| E[解析HTTP Body] E --> F{JSON解析成功?} F -->|Yes| G[构造返回对象] F -->|No| H[错误处理] H --> I[百分比解码] I --> G ``` 4. **潜在风险点**: - 未验证的URL路径拼接可能导致注入攻击 - JSON解析未处理异常数据类型 - 内存管理复杂可能引发泄漏(多处`Release`调用) - 硬编码字符串(如`0x65646F4363`="Cod")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值