如何将十六进制连接到C中的字符串
How to concatenate an hex to a string in C
我正在尝试创建一个由多个部分组成的字符串。它以普通字符串开始,在某个时候调用一个函数,用一个十六进制数填充一个指针。如下图所示。
PVOID hexval = NULL;
PCTSTR mystring = TEXT("BLA");
function(&hexval);
mystring += hexval; // just an idea of what I want, not actual code
如上所示,我希望 mystring
附加 hexvalue
。假设我的 hexvalue
是 0x424C41
。我想以 mystring
为 "BLABLA" 结束。
最好的方法是什么?
(假设我理解正确,并且预处理器未定义 UNICODE)
您应该执行以下操作:
- 为包含原始文本和新文本的字符串分配 space "text"。
- 将原始字符串复制到新位置。
- 在原始字符串的副本之后,从最低到最高连接 hexval 的字节。
这里有两个棘手的地方:
- 您还没有解释 "hex data" 是如何终止的。它的 "end" 处总是有一个 zero-valued 字节吗?或者 - 它有固定尺寸吗?
- 十六进制值的字节顺序可能不是您想要的字符串中的字节顺序。有些机器首先存储最低字节("little-endian";在您的示例中,它将是 0x41、0x4C、0x42、0x00 - 假设它是一个 4 字节值),而其他机器首先存储最高字节("big endian" ).如果您不知道自己在 little-endian 机器上,则需要重新排序字节并且不能直接从
hexval
复制。
但是! 我建议您不要这样做。最好避免陷入需要执行这些 brute-force 转换的情况。我敢打赌,您可能会以不同的方式解决您面临的任何问题。
#include <stddef.h>
#include <stdlib.h>
#include <windows.h>
#include <tchar.h>
int main(void)
{
ULONG_PTR value = 0x424C41;
LPVOID hexval = &value;
PCTSTR mystring = _T("BLA");
size_t length = _tcslen(mystring);
size_t new_size = length + sizeof(ULONG_PTR) + 1;
LPTSTR new_string = calloc(new_size, sizeof(*new_string));
_tcscpy(new_string, mystring);
size_t offset;
for (offset = sizeof(ULONG_PTR); offset && !((char*)hexval)[offset - 1]; --offset);
for (size_t i = length ? length : 0, k = offset; k; ++i, --k)
new_string[i] = ((char*)hexval)[k - 1];
_tprintf(_T("\"%s\"\n"), new_string);
free(new_string);
}
2019 年保持 ANSI-support 是受虐狂。
我正在尝试创建一个由多个部分组成的字符串。它以普通字符串开始,在某个时候调用一个函数,用一个十六进制数填充一个指针。如下图所示。
PVOID hexval = NULL;
PCTSTR mystring = TEXT("BLA");
function(&hexval);
mystring += hexval; // just an idea of what I want, not actual code
如上所示,我希望 mystring
附加 hexvalue
。假设我的 hexvalue
是 0x424C41
。我想以 mystring
为 "BLABLA" 结束。
最好的方法是什么?
(假设我理解正确,并且预处理器未定义 UNICODE)
您应该执行以下操作:
- 为包含原始文本和新文本的字符串分配 space "text"。
- 将原始字符串复制到新位置。
- 在原始字符串的副本之后,从最低到最高连接 hexval 的字节。
这里有两个棘手的地方:
- 您还没有解释 "hex data" 是如何终止的。它的 "end" 处总是有一个 zero-valued 字节吗?或者 - 它有固定尺寸吗?
- 十六进制值的字节顺序可能不是您想要的字符串中的字节顺序。有些机器首先存储最低字节("little-endian";在您的示例中,它将是 0x41、0x4C、0x42、0x00 - 假设它是一个 4 字节值),而其他机器首先存储最高字节("big endian" ).如果您不知道自己在 little-endian 机器上,则需要重新排序字节并且不能直接从
hexval
复制。
但是! 我建议您不要这样做。最好避免陷入需要执行这些 brute-force 转换的情况。我敢打赌,您可能会以不同的方式解决您面临的任何问题。
#include <stddef.h>
#include <stdlib.h>
#include <windows.h>
#include <tchar.h>
int main(void)
{
ULONG_PTR value = 0x424C41;
LPVOID hexval = &value;
PCTSTR mystring = _T("BLA");
size_t length = _tcslen(mystring);
size_t new_size = length + sizeof(ULONG_PTR) + 1;
LPTSTR new_string = calloc(new_size, sizeof(*new_string));
_tcscpy(new_string, mystring);
size_t offset;
for (offset = sizeof(ULONG_PTR); offset && !((char*)hexval)[offset - 1]; --offset);
for (size_t i = length ? length : 0, k = offset; k; ++i, --k)
new_string[i] = ((char*)hexval)[k - 1];
_tprintf(_T("\"%s\"\n"), new_string);
free(new_string);
}
2019 年保持 ANSI-support 是受虐狂。