小编Cha*_*rly的帖子

文件级别的USB Mass Storrage

挑战:我有一个Linux手持设备,它记录数据并将其存储到光盘.它应该通过USB与Windows应用程序交换这些数据.当用户可以访问这些数据时 - 例如通过USB大容量存储 - 它必须加密.它应该是开箱即用的,具有各种操作系统,也适用于Citrix终端会话等.

计划:我使用FUSE在用户空间中创建文件系统,并通过大容量存储将其提供给Windows.每当Windows访问一个文件时,我都会得到回调并动态加密数据.此外,我们可以拥有一些动态内容 - 例如,当某些密码被写入文件时,会显示更多内容.

问题:当使用海量存储小工具(例如g_file_storage)时,它只接受文件或块设备 - 但不接受文件系统(目录).为什么?

[...]它为读取和写入数据扇区提供了一个简单的接口 - 非常类似于用于访问任何硬盘驱动器的低级接口[...].操作系统可以将USB驱动器视为硬盘驱动器,并可以使用他们喜欢的任何文件系统对其进行格式化.(来自维基百科)

所以没有机会通过大容量存储来建立动态文件系统......这似乎是为什么当我将它连接到PC时,为什么我的Android手机会在手机上卸载所有数据.

选项:

  • 在用户空间中创建" 块设备 " - 类似于FUSE(当我想动态提供文件时需要反向FAT驱动程序)
  • 实现我自己的nbd-server来创建一个块设备(还需要一个反向FAT驱动程序?)
  • 我将加密文件保存到分区,并将此分区传递给大容量存储小工具(问题是性能和缺乏动态交互)
  • 不要提供大规模存储设备并注意其他想法(通过USB接口)

目前,只有最后一个选项似乎是现实的 - 或者你还有另一个提示吗?

我会很感激!

查理

linux usb-mass-storage block-device

10
推荐指数
2
解决办法
4474
查看次数

如何从最终二进制中排除未使用的方法?

我认为private在其类中未使用的方法将被编译器/链接器删除,并且不会成为最终二进制文件的一部分.

我创建了一个示例类,其中包含一个已实现但未使用的私有方法.

class XXX
{
  public:
  XXX();

  private:
  void MyUnusedMethod();
};
Run Code Online (Sandbox Code Playgroud)

并在实现文件中:

void XXX::MyUnusedMethod()
{
  const char* hugo = "ABCCHARLYABC";
  printf( hugo );
}
Run Code Online (Sandbox Code Playgroud)

编译后,字符串仍然存在于最终二进制文件中.为什么?我该如何防止这种情况?

最诚挚的问候,查理

c++ gcc

9
推荐指数
2
解决办法
1901
查看次数

如何确定库间依赖?

我的项目由几个静态库组成,这些库在最后一步中链接在一起.现在我遇到了问题,链接顺序很重要(否则我得到一个未定义的符号链接器错误).有时我遇到问题,我必须重新排序链接库(-lcommon -lsetup -lcontrol等).目前这是一个愚蠢的试验和错误:重新排序,编译,检查错误,重新排序,编译等等.

所以我写了一个小程序来向我展示库间依赖关系,并生成链接库的顺序.它从nm读取定义的('T','B'等)和未定义的符号('U')并从中删除弱符号('w','W','v'和'V') '未定义的符号列表'.现在它为每个未定义的符号确定解析它的库.

但我的程序向我展示了循环依赖...我的错误是什么?

如果它们真的存在,我根本无法联系......那么在分析nm输出时我错过了什么?或者正在分析nm输出而不是解决这些依赖关系?

libcommon.a:
         U _ZN15HardwareUnit23GetHardwareSerialNumberEv
libhardware.a:
00000484 T _ZN15HardwareUnit23GetHardwareSerialNumberEv
libsecurityaccess.a:
         U _ZN15HardwareUnit23GetHardwareSerialNumberEv
---
libhardware.a:
         U _ZN21ApplicationProfile26GetApplicationSettingsPathERK7QString
libsecurityaccess.a:
00004020 T _ZN21ApplicationProfile26GetApplicationSettingsPathERK7QString
         U _ZN21ApplicationProfile26GetApplicationSettingsPathERK7QString
Run Code Online (Sandbox Code Playgroud)

c++ gcc ld undefined-symbol nm

5
推荐指数
1
解决办法
6849
查看次数

"Getter/Setter中的价值验证"是一种好的风格吗?

我的Getter/Setter方法在设置/返回之前检查该值.当值无效时,它们会抛出异常(BadArgumentException或IllegalStateException).这是必需的,因为我们使用无效值初始化所有成员 - 因此我们避免使用这些无效值(==在其他地方获取错误/段错误/异常).

好处是:

  • 从模型中收到成员值时,您知道它们是有效的
  • 有效性检查仅在模型对象中执行
  • 值范围在model-object中定义

这似乎是非常不寻常的,因为大多数新团队成员首先抱怨它 - 即使他们在向我们解释之后同意我的意见.

问题:这是一种很好的编程风格吗?(即使它浪费了一点性能)

示例代码:

inline bool MyClass::HasGroupID const { return m_iGroupID != 0; }

int MyClass::GetGroupID() const
{
    if( !HasGroupID() )
        throw EPTIllegalStateException( "Cannot access uninitialized group ID!" );

    return m_iGroupID;

}   // END GetGroupID() const

void MyClass::SetGroupID( int iGroupID )
{
    // negative IDs are allowed!
    if( iGroupID != 0 )
        throw EPTBadArgumentException( "GroupID must not be zero!", iGroupID );

    m_iGroupID = iGroupID;

}   // END SetGroupID( int )
Run Code Online (Sandbox Code Playgroud)

用法 …

c++ getter setter exception

5
推荐指数
1
解决办法
2458
查看次数

如何防止QAbstractScrollArea / QTableView水平滚动?

我有一个QTableView和其中的一些内容。我想要类似的行为,horizontalHeader() -> setResizeMode( ResizeToContent )但它不能创建水平滚动条-我的意思是视口一定不能比表格宽。

即使创建新的QHeaderView也不是一件容易的事,因为只有几种虚拟方法。

绘图以可视化问题

提前致谢,

查理

PS:我有一个自定义项目委托,它用“ ...”缩短了长文本。它以sizeHint()的形式返回完整大小,但是当paint()方法接收到较小的大小时(例如,使用resizeMode()== Qt :: Interactive模拟),它将裁剪内容。

qt qtableview qscrollarea

4
推荐指数
1
解决办法
3854
查看次数

Firefox 只显示空白页面 - 即使 about:config 也只是白色

从某一天到另一天 Firefox 只显示空白页面: 在此处输入图片说明

我试过了

  • 启动 Firefox --safe-mode
  • 启动 Firefox--ProfileManager并创建一个新的配置文件
  • 打开开发人员工具 - 但他们没有出现
  • 去除 ~/.mozilla
  • 重新安装了 Firefox sudo apt purge firefox && sudo apt install firefox

没有任何工作。Firefox 甚至不显示错误消息。Chromium 仍然按预期工作。

firefox citrix

4
推荐指数
1
解决办法
813
查看次数

方法中对象所有权的命名约定

有没有办法编码方法的签名,无论对象所有者是否发生变化?在获取或返回指针的Getter()和Setter()中,您永远不知道对象所有权是否发生了变化.

你有什么想法:

// Uses pConfiguration or creates its own copy - the ownership is un-touched
void ContainerClass:SetConfiguration( const Configuration* pConfiguration ) {}
// Takes the ownership of pConfiguration (and deletes it in the destructor)
void ContainerClass:PutConfiguration( Configuration* pConfiguration ) {}
// Returns a 'reference' and keeps the ownership (you must not delete it)
const Configuration* ContainerClass::GetConfiguration() {}
// Returns a _new_ object and transfers the ownership to you
Configuration* ContainerClass::TakeConfiguration() {}
Run Code Online (Sandbox Code Playgroud)

那么Set()和Put()以及Get()和Take()是一种编码方式,或者你会使用类型(const与非const) - 或者你是否从上下文中知道它?

最好的祝福,

查理

c++ oop naming-conventions

3
推荐指数
1
解决办法
422
查看次数

打开和写入/ dev/null的特殊处理?

根据另一个线程的提示,我想分析指针,如果它们的解引用会导致分段错误.想法是编写这样的代码:

bool IsPointerValid( void* pPointer )
{
    // when opening "/tmp/hugo" here, it works fine... but not with /dev/null??
    int iFD = open( "/dev/null", O_WRONLY );
    int iBytesWritten = write( iFD, pPointer, 4 );
    close( iFD );

    return iBytesWritten > 0;
}
Run Code Online (Sandbox Code Playgroud)

但whatevery我传递到IsPointerValid(..),它返回总是如此-因为iBytesWritten始终4.但是当打开"/tmp/testfile"或者是fifo时,它会像预期的那样工作:传递NULL指针write(..),它返回-1.

这种特殊治疗的原因是"/dev/null"什么?

谢谢,

查理

linux gcc g++ dev-null

2
推荐指数
1
解决办法
2162
查看次数

如何使用 GVIM 或 VI 查看 TAR 文件的原始内容?

我正在开发一个通过 MTP 动态创建 TAR 文件的程序。出于这个原因,我想查看 TAR 文件的“原始内容”——而不是提取的内容。

它不需要是十六进制视图,只要内容就足够了。我认为“gvim -b”(二进制)可以解决问题……但我仍然得到文件列表。我目前的解决方法是将文件重命名为“*.dat”以查看原始内容......但这很难看。此外,在 Windows 上,我只收到错误消息“您的系统上不可用 tar”,并且没有显示任何内容 - 而不是显示原始内容......

vim

2
推荐指数
1
解决办法
1541
查看次数