通过内省从 ctype 结构中获取元素?

2023-11-26

我找不到任何东西可以帮助我解决此类问题:我试图获取属于嵌套结构一部分的属性的偏移量,例如:

数据类型.py

class FirstStructure (ctypes.Structure):
    _fields_ = [('Junk', ctypes.c_bool),
                ('ThisOneIWantToGet', ctypes.c_int8)
                ]


class SecondStructure (ctypes.Structure):
    _fields_ = [('Junk', ctypes.c_double),
                ('Example', FirstStructure)
                ]

值得一提的是,我只知道父结构的名称SecondStructure我完全不知道那里可以有多少嵌套结构。

我想要在这里做的是获得偏移量ThisOneIWantToGet属性从 开始SecondStructure.

我知道有ctypes.adressof适用于 ctypes 对象的方法。是否有任何简单的方法来获取嵌套参数的对象,以便我可以执行以下操作:

do_something.py

import data_types as dt
par_struct_obj = getattr(dt, 'SecondStructure')
par_obj = getattr(par_struct_obj , 'ThisOneIWantToGet')
print ctypes.addressof(parameter) - ctypes.addressof(parent_structure)

我首先要指出ctypes官方文档:[Python 3.5]:ctypes - Python 的外部函数库.

我定义了一个更复杂的结构树(2 个嵌套级别)。

数据类型.py:

import ctypes


PRAGMA_PACK = 0


class Struct2(ctypes.Structure):
    if PRAGMA_PACK:
        _pack_ = PRAGMA_PACK
    _fields_ = [
        ("c_0", ctypes.c_char),  # 1B
        ("s_0", ctypes.c_short),  # 2B
        ("wanted", ctypes.c_int), # 4B
    ]


class Struct1(ctypes.Structure):
    if PRAGMA_PACK:
        _pack_ = PRAGMA_PACK
    _fields_ = [
        ("d_0", ctypes.c_double),  # 8B
        ("c_0", ctypes.c_char),  # 1B
        ("struct2_0", Struct2),
    ]


class Struct0(ctypes.Structure):
    if PRAGMA_PACK:
        _pack_ = PRAGMA_PACK
    _fields_ = [
        ("i_0", ctypes.c_int),  # 4B
        ("s_0", ctypes.c_short),  # 2B
        ("struct1_0", Struct1),
    ]

Notes:

  • 我指定了感兴趣的成员wanted(部分Struct2这是最深的)
  • 处理事情时重要的一件事structs, it's 结盟. Check [MSDN]:#pragma pack更多细节。

In order to illustrate the 2nd bullet (above), I prepared a small example (which has nothing to do with the question).

测试地址.py:

import sys
import ctypes
import data_types


OFFSET_TEXT = "Offset of '{:s}' member in '{:s}' instance: {:3d} (0x{:08X})"


def offset_addressof(child_structure_instance, parent_structure_instance):
    return ctypes.addressof(child_structure_instance) - ctypes.addressof(parent_structure_instance)


def print_offset_addressof_data(child_structure_instance, parent_structure_instance):
    offset = offset_addressof(child_structure_instance, parent_structure_instance)
    print(OFFSET_TEXT.format(child_structure_instance.__class__.__name__, parent_structure_instance.__class__.__name__, offset, offset))


def main():
    s0 = data_types.Struct0()
    s1 = s0.struct1_0
    s2 = s1.struct2_0
    print("PRAGMA_PACK: {:d} {:s}\n".format(data_types.PRAGMA_PACK, "" if data_types.PRAGMA_PACK else "(default)"))
    print_offset_addressof_data(s1, s0)
    print_offset_addressof_data(s2, s1)
    print_offset_addressof_data(s2, s0)
    print("\nAlignments and sizes:\n\t'{:s}': {:3d} - {:3d}\n\t'{:s}': {:3d} - {:3d}\n\t'{:s}': {:3d} - {:3d}".format(
            s0.__class__.__name__, ctypes.alignment(s0), ctypes.sizeof(s0),
            s1.__class__.__name__, ctypes.alignment(s1), ctypes.sizeof(s1),
            s2.__class__.__name__, ctypes.alignment(s2), ctypes.sizeof(s2)
        )
    )
    #print("Struct0().i_0 type: {:s}".format(s0.i_0.__class__.__name__))


if __name__ == "__main__":
    print("Python {:s} on {:s}\n".format(sys.version, sys.platform))
    main()

Notes:

  • Native C成员类型转换为Python类型,在一个ctypes.Structure, and ctypes.addressof会提高类型错误如果收到这样的论点(检查注释print from main)
  • 我尝试使用C不同类型具有相同大小OSes(例如我避免了ctypes.c_long其长度为 8 个字节Lnx和 4 个字节长Win(当然是指 64 位版本))
  • 两次示例运行之间需要修改源代码。我可以动态生成类,但这会给代码增加不必要的复杂性(并且偏离了我想要表达的观点)

Output:

(py35x64_test) e:\Work\Dev\StackOverflow\q050304516>python test_addressof.py
Python 3.5.4 (v3.5.4:3f56838, Aug  8 2017, 02:17:05) [MSC v.1900 64 bit (AMD64)] on win32

PRAGMA_PACK: 0 (default)

Offset of 'Struct1' member in 'Struct0' instance:   8 (0x00000008)
Offset of 'Struct2' member in 'Struct1' instance:  12 (0x0000000C)
Offset of 'Struct2' member in 'Struct0' instance:  20 (0x00000014)

Alignments and sizes:
        'Struct0':   8 -  32
        'Struct1':   8 -  24
        'Struct2':   4 -   8

(py35x64_test) e:\Work\Dev\StackOverflow\q050304516>rem change PRAGMA_PACK = 1 in data_types.py

(py35x64_test) e:\Work\Dev\StackOverflow\q050304516>python test_addressof.py
Python 3.5.4 (v3.5.4:3f56838, Aug  8 2017, 02:17:05) [MSC v.1900 64 bit (AMD64)] on win32

PRAGMA_PACK: 1

Offset of 'Struct1' member in 'Struct0' instance:   6 (0x00000006)
Offset of 'Struct2' member in 'Struct1' instance:   9 (0x00000009)
Offset of 'Struct2' member in 'Struct0' instance:  15 (0x0000000F)

Alignments and sizes:
        'Struct0':   1 -  22
        'Struct1':   1 -  16
        'Struct2':   1 -   7


struct_util.py:

import sys
import ctypes

import data_types


WANTED_MEMBER_NAME = "wanted"
FIELDS_MEMBER_NAME = "_fields_"


def _get_padded_size(sizes, align_size):
    padded_size = temp = 0
    for size in sizes:
        if temp >= align_size:
            padded_size += temp
            temp = size
        elif temp + size > align_size:
            padded_size += align_size
            temp = size
        else:
            temp += size
    if temp:
        padded_size += max(size, align_size)
    return padded_size


def _get_array_type_sizes(array_type):
    if issubclass(array_type._type_, ctypes.Array):
        return _get_array_type_sizes(array_type._type_) * array_type._type_._length_
    else:
        return [array_type._type_] * array_type._length_


def get_nested_offset_recursive(struct_instance, wanted_member_name):
    if not isinstance(struct_instance, ctypes.Structure):
        return -1
    align_size = ctypes.alignment(struct_instance)
    base_address = ctypes.addressof(struct_instance)
    member_sizes = list()
    for member_name, member_type in getattr(struct_instance, FIELDS_MEMBER_NAME, list()):
        if member_name == wanted_member_name:
            return _get_padded_size(member_sizes, align_size)
        if issubclass(member_type, ctypes.Structure):
            nested_struct_instance = getattr(struct_instance, member_name)
            inner_offset = get_nested_offset_recursive(nested_struct_instance, wanted_member_name)
            if inner_offset != -1:
                return ctypes.addressof(nested_struct_instance) - base_address + inner_offset
            else:
                member_sizes.append(ctypes.sizeof(member_type))
        else:
            if issubclass(member_type, ctypes.Array):
                member_sizes.extend(_get_array_type_sizes(member_type))
            else:
                member_sizes.append(ctypes.sizeof(member_type))
    return -1


def _get_struct_instance_from_name(struct_name):
    struct_class = getattr(data_types, struct_name, None)
    if struct_class:
        return struct_class()


def get_nested_offset(struct_name, wanted_member_name):
    struct_instance = _get_struct_instance_from_name(struct_name)
    return get_nested_offset_recursive(struct_instance, wanted_member_name)


def main():
    struct_names = [
        "Struct2",
        "Struct1",
        "Struct0"
    ]
    wanted_member_name = WANTED_MEMBER_NAME
    print("PRAGMA_PACK: {:d} {:s}\n".format(data_types.PRAGMA_PACK, "" if data_types.PRAGMA_PACK else "(default)"))
    for struct_name in struct_names:
        print("'{:s}' offset in '{:s}' (size: {:3d}): {:3d}".format(wanted_member_name,
                                                                    struct_name,
                                                                    ctypes.sizeof(_get_struct_instance_from_name(struct_name)),
                                                                    get_nested_offset(struct_name, wanted_member_name)))


if __name__ == "__main__":
    print("Python {:s} on {:s}\n".format(sys.version, sys.platform))
    main()

Notes:

  • 该代码(waaaay)比我最初预期的更复杂。我认为有一个更简单的方法,但我就是看不到。希望我没有错过如此明显的事情,整个事情可以用 2 - 3 行代码完成
  • 它应该适用于任何结构,尽管有(很多)情况我没有测试(特别是结构数组,其中有些情况不起作用)
  • It will stop at the 1st member occurrence found
  • Functions (1 by 1):
    • get_nested_offset_recursive - core function: recursively searches for the member in the structures and calculates its offset. There are 2 cases:
      • 会员处于child结构(或child's child, ...): 偏移到child结构体的计算方法是减去 2 个结构体地址(使用ctypes.addressof)
      • 成员位于当前结构中(复杂情况):计算偏移量时考虑其之前成员的大小以及结构对齐
    • _get_padd_size- 尝试适应成员尺寸(在我们关心的尺寸之前)对齐大小大块,并返回块大小总和
    • _get_array_type_sizes- 数组不是atomic(从对齐PoV): a char c[10];成员可以替换为char c0, c1, ..., c9;。这就是这个函数的作用(递归)
    • _get_struct_instance_from_\name- 辅助函数或便利函数:返回结构名称的实例(在数据类型模块)作为参数给出
    • 获取嵌套偏移量- 包装函数

Output(同上原理):

(py35x64_test) e:\Work\Dev\StackOverflow\q050304516>python struct_util.py
Python 3.5.4 (v3.5.4:3f56838, Aug  8 2017, 02:17:05) [MSC v.1900 64 bit (AMD64)] on win32

PRAGMA_PACK: 0 (default)

'wanted' offset in 'Struct2' (size:   8):   4
'wanted' offset in 'Struct1' (size:  24):  16
'wanted' offset in 'Struct0' (size:  32):  24

(py35x64_test) e:\Work\Dev\StackOverflow\q050304516>rem change PRAGMA_PACK = 1 in data_types.py

(py35x64_test) e:\Work\Dev\StackOverflow\q050304516>python struct_util.py
Python 3.5.4 (v3.5.4:3f56838, Aug  8 2017, 02:17:05) [MSC v.1900 64 bit (AMD64)] on win32

PRAGMA_PACK: 1

'wanted' offset in 'Struct2' (size:   7):   3
'wanted' offset in 'Struct1' (size:  16):  12
'wanted' offset in 'Struct0' (size:  22):  18

@EDIT0:

As I specified in the 1st and (especially) the 2nd notes, I wasn't happy with the solution, mainly because even if it works the current scenario, it doesn't for the general one (nesting arrays and structures). Then I came across [SO]: Ctypes: Get a pointer to a struct field (@MarkTolonen's answer), and took a different approach.

数据类型.py (add前面内容的代码如下):

class Struct0_1(ctypes.Structure):
    if PRAGMA_PACK:
        _pack_ = PRAGMA_PACK
    _fields_ = [
        ("i_0", ctypes.c_int),  # 4B
        ("s_0", ctypes.c_short),  # 2B
        ("struct1_0_2", Struct1 * 2),
        ("i_1", ctypes.c_int * 2),  # 2 * 4B
        ("struct1_1", Struct1),
        ("i_2", ctypes.c_int),  # 4B
        ("struct1_2_3", Struct1 * 3),
    ]

struct_util_v2.py:

import sys
import ctypes

import data_types


WANTED_MEMBER_NAME = "wanted"

def _get_nested_offset_recursive_struct(struct_ctype, member_name):
    for struct_member_name, struct_member_ctype in struct_ctype._fields_:
        struct_member = getattr(struct_ctype, struct_member_name)
        offset = struct_member.offset
        if struct_member_name == member_name:
            return offset
        else:
            if issubclass(struct_member_ctype, ctypes.Structure):
                inner_offset = _get_nested_offset_recursive_struct(struct_member_ctype, member_name)
            elif issubclass(struct_member_ctype, ctypes.Array):
                inner_offset = _get_nested_offset_recursive_array(struct_member_ctype, member_name)
            else:
                inner_offset = -1
            if inner_offset != -1:
                return inner_offset + offset
    return -1


def _get_nested_offset_recursive_array(array_ctype, member_name):
    array_base_ctype = array_ctype._type_
    for idx in range(array_ctype._length_):
        if issubclass(array_base_ctype, ctypes.Structure):
            inner_offset = _get_nested_offset_recursive_struct(array_base_ctype, member_name)
        elif issubclass(array_base_ctype, ctypes.Array):
            inner_offset = _get_nested_offset_recursive_array(array_base_ctype, member_name)
        else:
            inner_offset = -1
        return inner_offset


def get_nested_offset_recursive(ctype, member_name, nth=1):
    if issubclass(ctype, ctypes.Structure):
        return _get_nested_offset_recursive_struct(ctype, member_name)
    elif issubclass(ctype, ctypes.Array):
        return _get_nested_offset_recursive_array(ctype, member_name)
    else:
        return -1


def main():
    struct_names = [
        "Struct2",
        "Struct1",
        "Struct0",
        "Struct0_1",
    ]
    member_name = WANTED_MEMBER_NAME
    print("PRAGMA_PACK: {:d} {:s}\n".format(data_types.PRAGMA_PACK, "" if data_types.PRAGMA_PACK else "(default)"))
    for struct_name in struct_names:
        struct_ctype = getattr(data_types, struct_name)
        print("'{:s}' offset in '{:s}' (size: {:3d}): {:3d}".format(member_name,
                                                                    struct_name,
                                                                    ctypes.sizeof(struct_ctype),
                                                                    get_nested_offset_recursive(struct_ctype, member_name)))


if __name__ == "__main__":
    print("Python {:s} on {:s}\n".format(sys.version, sys.platform))
    main()

Notes:

  • 不再使用实例,因为偏移元数据存储在类本身中(地址不再需要)
  • 对于新添加的结构,以前的代码不起作用
  • 新代码的真正威力在于处理获取嵌套偏移量递归's nth参数(现在什么也不做 - 可以删除)告诉应该报告成员名称的哪个出现的偏移量(它只对结构数组有意义),但这有点复杂,因此需要更多代码
  • 争论的主题可能是结构成员是指向结构的指针(有些人可能会认为将它们视为数组),但我认为由于此类(内部)结构驻留在另一个内存区域中,因此只需跳过它们(事实上,使用这种方法与决定无关)

Output:

(py35x64_test) e:\Work\Dev\StackOverflow\q050304516>python struct_util_v2.py
Python 3.5.4 (v3.5.4:3f56838, Aug  8 2017, 02:17:05) [MSC v.1900 64 bit (AMD64)] on win32

PRAGMA_PACK: 0 (default)

'wanted' offset in 'Struct2' (size:   8):   4
'wanted' offset in 'Struct1' (size:  24):  16
'wanted' offset in 'Struct0' (size:  32):  24
'wanted' offset in 'Struct0_1' (size: 168):  24

(py35x64_test) e:\Work\Dev\StackOverflow\q050304516>rem change PRAGMA_PACK = 1 in data_types.py

(py35x64_test) e:\Work\Dev\StackOverflow\q050304516>python struct_util_v2.py
Python 3.5.4 (v3.5.4:3f56838, Aug  8 2017, 02:17:05) [MSC v.1900 64 bit (AMD64)] on win32

PRAGMA_PACK: 1

'wanted' offset in 'Struct2' (size:   7):   3
'wanted' offset in 'Struct1' (size:  16):  12
'wanted' offset in 'Struct0' (size:  22):  18
'wanted' offset in 'Struct0_1' (size: 114):  18

@EDIT1:

添加了对以下内容的支持nth参数(重命名为:index).

struct_util_v3.py:

import sys
import ctypes

import data_types


WANTED_MEMBER_NAME = "wanted"
OFFSET_INVALID = -1

def _get_nested_offset_recursive_struct(struct_ctype, member_name, index):
    current_index = 0
    for struct_member_name, struct_member_ctype in struct_ctype._fields_:
        struct_member = getattr(struct_ctype, struct_member_name)
        offset = struct_member.offset
        if struct_member_name == member_name:
            if index == 0:
                return offset, 0
            else:
                current_index += 1
        else:
            if issubclass(struct_member_ctype, ctypes.Structure):
                inner_offset, occurences = _get_nested_offset_recursive_struct(struct_member_ctype, member_name, index - current_index)
            elif issubclass(struct_member_ctype, ctypes.Array):
                inner_offset, occurences = _get_nested_offset_recursive_array(struct_member_ctype, member_name, index - current_index)
            else:
                inner_offset, occurences = OFFSET_INVALID, 0
            if inner_offset != OFFSET_INVALID:
                return inner_offset + offset, 0
            else:
                current_index += occurences
    return OFFSET_INVALID, current_index


def _get_nested_offset_recursive_array(array_ctype, member_name, index):
    array_base_ctype = array_ctype._type_
    array_base_ctype_size = ctypes.sizeof(array_base_ctype)
    current_index = 0
    for idx in range(array_ctype._length_):
        if issubclass(array_base_ctype, ctypes.Structure):
            inner_offset, occurences = _get_nested_offset_recursive_struct(array_base_ctype, member_name, index - current_index)
        elif issubclass(array_base_ctype, ctypes.Array):
            inner_offset, occurences = _get_nested_offset_recursive_array(array_base_ctype, member_name, index - current_index)
        else:
            inner_offset, occurences = OFFSET_INVALID, 0
        if inner_offset != OFFSET_INVALID:
            return array_base_ctype_size * idx + inner_offset, 0
        else:
            if occurences == 0:
                return OFFSET_INVALID, 0
            else:
                current_index += occurences
    return OFFSET_INVALID, current_index


def get_nested_offset_recursive(ctype, member_name, index=0):
    if index < 0:
        return OFFSET_INVALID
    if issubclass(ctype, ctypes.Structure):
        return _get_nested_offset_recursive_struct(ctype, member_name, index)[0]
    elif issubclass(ctype, ctypes.Array):
        return _get_nested_offset_recursive_array(ctype, member_name, index)[0]
    else:
        return OFFSET_INVALID


def main():
    struct_names = [
        "Struct2",
        "Struct1",
        "Struct0",
        "Struct0_1",
    ]
    member_name = WANTED_MEMBER_NAME
    print("PRAGMA_PACK: {:d} {:s}\n".format(data_types.PRAGMA_PACK, "" if data_types.PRAGMA_PACK else "(default)"))
    for struct_name in struct_names:
        struct_ctype = getattr(data_types, struct_name)
        nth = 1
        ofs = get_nested_offset_recursive(struct_ctype, member_name, index=nth - 1)
        while ofs != OFFSET_INVALID:
            print("'{:s}' offset (#{:03d}) in '{:s}' (size: {:3d}): {:3d}".format(member_name,
                                                                                 nth,
                                                                                 struct_name,
                                                                                 ctypes.sizeof(struct_ctype),
                                                                                 ofs))
            nth += 1
            ofs = get_nested_offset_recursive(struct_ctype, member_name, index=nth - 1)


if __name__ == "__main__":
    print("Python {:s} on {:s}\n".format(sys.version, sys.platform))
    main()

Notes:

  • get_nested_offset_recursive's index argument is the (0 based) index in the member occurrences list - or how many occurrences to skip before reporting the offset (default: 0 - meaning that it will report 1st occurrence's offset)
  • 没有彻底测试,但我想我涵盖了所有情况
  • 对于每个结构,程序列出所有成员出现的偏移量(直到找不到)
  • 现在,代码就是我一开始想到的形状

Output:

(py35x64_test) e:\Work\Dev\StackOverflow\q050304516>python struct_util_v3.py
Python 3.5.4 (v3.5.4:3f56838, Aug  8 2017, 02:17:05) [MSC v.1900 64 bit (AMD64)] on win32

PRAGMA_PACK: 0 (default)

'wanted' offset (#001) in 'Struct2' (size:   8):   4
'wanted' offset (#001) in 'Struct1' (size:  24):  16
'wanted' offset (#001) in 'Struct0' (size:  32):  24
'wanted' offset (#001) in 'Struct0_1' (size: 192):  24
'wanted' offset (#002) in 'Struct0_1' (size: 192):  48
'wanted' offset (#003) in 'Struct0_1' (size: 192):  72
'wanted' offset (#004) in 'Struct0_1' (size: 192): 104
'wanted' offset (#005) in 'Struct0_1' (size: 192): 136
'wanted' offset (#006) in 'Struct0_1' (size: 192): 160

(py35x64_test) e:\Work\Dev\StackOverflow\q050304516>rem change PRAGMA_PACK = 1 in data_types.py

(py35x64_test) e:\Work\Dev\StackOverflow\q050304516>python struct_util_v3.py
Python 3.5.4 (v3.5.4:3f56838, Aug  8 2017, 02:17:05) [MSC v.1900 64 bit (AMD64)] on win32

PRAGMA_PACK: 1

'wanted' offset (#001) in 'Struct2' (size:   7):   3
'wanted' offset (#001) in 'Struct1' (size:  16):  12
'wanted' offset (#001) in 'Struct0' (size:  22):  18
'wanted' offset (#001) in 'Struct0_1' (size: 130):  18
'wanted' offset (#002) in 'Struct0_1' (size: 130):  34
'wanted' offset (#003) in 'Struct0_1' (size: 130):  50
'wanted' offset (#004) in 'Struct0_1' (size: 130):  74
'wanted' offset (#005) in 'Struct0_1' (size: 130):  94
'wanted' offset (#006) in 'Struct0_1' (size: 130): 110
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过内省从 ctype 结构中获取元素? 的相关文章

随机推荐

  • Angular4 材质输入无法正确显示

    我正在尝试将材质放入 angular4 项目中 在该项目中我用表格复制 粘贴了示例 当我输入客户名称时 编程部分按预期工作 它按应有的方式进行过滤 并且下表显示得非常好 问题是 mat form field 内的 matInput 未正确显
  • 使用 jQuery 检查是否至少选中了一个复选框

    我有五个复选框 使用 jQuery 我如何检查是否至少检查了其中之一
  • 显示更新时从 Flask 视图流式传输的数据

    我有一个可以生成数据并实时传输数据的视图 我不知道如何将此数据发送到可以在 HTML 模板中使用的变量 我当前的解决方案只是在数据到达时将其输出到空白页面 这是可行的 但我想将其包含在带有格式的更大页面中 当数据流式传输到页面时 如何更新
  • 如何使用 Python 获取 1200 英寸的 truetype 字体字符宽度?

    我可以使用 PIL 获取字符的高度和宽度 以像素为单位 见下文 但是 除非我弄错了 像素大小取决于屏幕的 DPI 它可能会有所不同 相反 我想做的是以绝对单位 例如英寸或 1200 英寸 wordperfect 单位 计算字符的宽度 gt
  • 在一个范围内选择一个范围

    我使用以下 VBA 代码 MS Excel 2010 选择给定范围内的一系列单元格 复制复制的单元格并将其插入回源范围 该范围从工作表中的第 2 行开始 一直到第 2200 行 从第 50 列到第 65 列 Set rngFEA shtTa
  • bazel支持测试执行顺序吗?

    我想在运行其他更深入的端到端测试之前运行一定数量的端到端集成测试 只要我不使用 keep going标记第一个测试失败应该退出bazel test 会议 我希望在更深入的测试之前运行更浅的端到端测试 有没有办法从 bazel 管理测试执行顺
  • 确定数独是否有唯一解

    我正在努力使用回溯算法来确定数独是否具有唯一的解决方案或是否具有多个解决方案 这是我使用的回溯代码 static boolean solve int i int j int cells if i 9 i 0 if j 9 return tr
  • 如何在 XML 视图中动态加载 XML 片段?

    假设我有以下 XML 视图
  • 使用 Jquery datepicker 添加选定日期的一天

    我一直在尝试为另一个日期字段添加一天 并选择当前字段的日期 onSelect function date var date2 currDate datepicker getDate date2 setDate date2 getDate 1
  • 仅使用 SQL 将图片插入 SQL Server 2005 图像字段

    使用 SQL Server 2005 和 Management Studio 如何将图片插入到Image键入表格的列 最重要的是我如何验证它是否存在 CREATE TABLE Employees Id int Name varchar 50
  • Java:Swing 的安全动画

    我正在创建一个使用 JFrame JPanel JLabel 和所有其他类型的 swing 组件的程序 我想要做的是在专用于该动画的单独 JPanel 上创建 2D 动画 所以我将重写 PaintComponent Graphics g 方
  • 在 java 类中为 firestore 文档指定序列化名称

    我正在尝试存储一个document在我的 Android 应用程序的 firestore 中使用自定义对象 如果我使用 proguard 来构建我的应用程序 有没有办法为我的类中的字段指定序列化名称 就像这样Gson提供使用 Seriali
  • SQL Server 2008 对具有复合主键的表进行全文搜索

    我试图在 SQL Server 2008 上进行全文搜索 但是我尝试索引的表是一个具有复合主键的表 如下所示 EXEC sp fulltext catalog My Catalog create EXEC sp fulltext table
  • Stylesheet_link_tag :all 与 :media =>all

    我从脚手架创建了一个新的 Rails 应用程序 但教程声称将出现以下内容 当我得到 它们之间有什么区别 我应该使用哪个 为什么 Using 将包含名为的样式表应用程序 css 你可以有这样的文件应用程序 css sass or 应用程序 c
  • pymongo 中使用 collection.find() 的嵌套查询

    我想使用 mongodb 创建一个数据库 我想知道如何查询嵌套实体 例如 假设我们创建一个数据库 如下所示 from pymongo import MongoClient db client test database collection
  • 如何在startup.cs的ConfigureServices方法中正确注入DbContext实例(ASP.net core 1.1)?

    我已经实施了EntityFrameworkFileProvider对于我的 ASP NET Core Web 应用程序 我想要ViewDbContext由 ASP NET core DI 框架在构造函数中注入的实例 ViewDbContex
  • 如何知道共享主机 (GoDaddy) 是否支持 ASP.NET Web API [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我试图弄清楚是否可以在 GoDaddy 上部署 Web API 应用程序 但找不到好的答案 我最接近的是这个链接 http support godaddy com groups
  • 如何在 Sagemaker 2 中使用序列化器和反序列化器

    我使用 Sagemaker 笔记本启动conda python3内核 并遵循example笔记本用于随机砍伐森林 截至撰写本文时 Sagemaker SDK附带conda python3版本是1 72 0 但是我想使用新功能 所以我更新我的
  • 在elasticsearch中突出显示部分单词

    我使用 n gram 分词器在弹性搜索中做了一个自动建议 现在我想在自动建议列表中突出显示用户输入的字符序列 为此 我使用了弹性搜索中可用的荧光笔 我的代码如下 但在输出中 完整的术语被突出显示 我哪里出错了 query query str
  • 通过内省从 ctype 结构中获取元素?

    我找不到任何东西可以帮助我解决此类问题 我试图获取属于嵌套结构一部分的属性的偏移量 例如 数据类型 py class FirstStructure ctypes Structure fields Junk ctypes c bool Thi