【问题标题】:How to concatenate an hex to a string in C如何将十六进制连接到C中的字符串
【发布时间】:2019-09-29 05:29:04
【问题描述】:

我正在尝试创建一个由多个部分组成的字符串。它以普通字符串开始,在某些时候调用一个函数,用十六进制数填充指针。如下图。

PVOID hexval = NULL;
PCTSTR mystring = TEXT("BLA");

function(&hexval);

mystring += hexval;  // just an idea of what I want, not actual code

如上所示,我希望 mystring 附加 hexvalue。假设我的hexvalue0x424C41。我想以mystring 结尾为“BLABLA”。

最好的方法是什么?

【问题讨论】:

  • TEXT() 宏有什么作用?
  • 如果您实际上正在编写 C 代码,mystring += 是一个不好的迹象。
  • 最标准的选项是使用sprintfen.cppreference.com/w/c/io/fprintf
  • @einpoklum 当 UNICODE 被定义为宽字符串 (UTF-16) 时,它会在 L 前面加上字符串文字
  • @DavidHoelzer:OP 确实说过那不是真正的代码。

标签: c winapi tchar


【解决方案1】:

(假设我理解正确,并且 UNICODE 不是由预处理器定义的)

您应该执行以下操作:

  1. 为同时包含原始文本和新“文本”的字符串分配空间。
  2. 将原始字符串复制到新位置。
  3. 在原始字符串的副本之后连接十六进制的字节,从最低到最高。

这里有两个棘手的地方:

  1. 您还没有解释“十六进制数据”是如何终止的。它的“末尾”总是有一个零值字节吗?或者 - 它有固定的大小吗?
  2. 十六进制值的字节顺序可能不是您想要的字符串中的字节顺序。有些机器首先存储最低字节(“little-endian”;在您的示例中,它将是 0x41、0x4C、0x42、0x00 - 假设它是一个 4 字节值),而其他机器首先存储最高字节(“big endian”) .如果您不知道自己使用的是 little-endian 机器,则需要重新排序字节,并且不能直接从 hexval 复制。

但是!我建议您不要这样做。最好避免陷入需要执行这些蛮力转换的情况。我敢打赌,您可能会以不同的方式解决您面临的任何问题。

【讨论】:

  • sprintf 是最好的方法吗?十六进制数据始终具有相同的固定大小。
  • @Diego:不,我没有说sprintf() 是“它”的最佳方式,因为我不知道“它”是什么。我建议的三个步骤,在 little-endian 机器上将涉及 malloc() 用于分配和 strcpy() / strncpy() 用于复制两个字符串。
【解决方案2】:
#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 的支持是受虐狂。

【讨论】:

    猜你喜欢
    • 2018-01-31
    • 2019-07-27
    • 2012-01-24
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    • 2015-05-26
    • 2019-02-21
    • 2020-11-07
    相关资源
    最近更新 更多