挑战:我有一个Linux手持设备,它记录数据并将其存储到光盘.它应该通过USB与Windows应用程序交换这些数据.当用户可以访问这些数据时 - 例如通过USB大容量存储 - 它必须加密.它应该是开箱即用的,具有各种操作系统,也适用于Citrix终端会话等.
计划:我使用FUSE在用户空间中创建文件系统,并通过大容量存储将其提供给Windows.每当Windows访问一个文件时,我都会得到回调并动态加密数据.此外,我们可以拥有一些动态内容 - 例如,当某些密码被写入文件时,会显示更多内容.
问题:当使用海量存储小工具(例如g_file_storage)时,它只接受文件或块设备 - 但不接受文件系统(目录).为什么?
[...]它为读取和写入数据扇区提供了一个简单的接口 - 非常类似于用于访问任何硬盘驱动器的低级接口[...].操作系统可以将USB驱动器视为硬盘驱动器,并可以使用他们喜欢的任何文件系统对其进行格式化.(来自维基百科)
所以没有机会通过大容量存储来建立动态文件系统......这似乎是为什么当我将它连接到PC时,为什么我的Android手机会在手机上卸载所有数据.
选项:
目前,只有最后一个选项似乎是现实的 - 或者你还有另一个提示吗?
我会很感激!
查理
我认为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)
编译后,字符串仍然存在于最终二进制文件中.为什么?我该如何防止这种情况?
最诚挚的问候,查理
我的项目由几个静态库组成,这些库在最后一步中链接在一起.现在我遇到了问题,库的链接顺序很重要(否则我得到一个未定义的符号链接器错误).有时我遇到问题,我必须重新排序链接库(-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) 我的Getter/Setter方法在设置/返回之前检查该值.当值无效时,它们会抛出异常(BadArgumentException或IllegalStateException).这是必需的,因为我们使用无效值初始化所有成员 - 因此我们避免使用这些无效值(==在其他地方获取错误/段错误/异常).
好处是:
这似乎是非常不寻常的,因为大多数新团队成员首先抱怨它 - 即使他们在向我们解释之后同意我的意见.
问题:这是一种很好的编程风格吗?(即使它浪费了一点性能)
示例代码:
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)
用法 …
我有一个QTableView和其中的一些内容。我想要类似的行为,horizontalHeader() -> setResizeMode( ResizeToContent )
但它不能创建水平滚动条-我的意思是视口一定不能比表格宽。
即使创建新的QHeaderView也不是一件容易的事,因为只有几种虚拟方法。
提前致谢,
查理
PS:我有一个自定义项目委托,它用“ ...”缩短了长文本。它以sizeHint()的形式返回完整大小,但是当paint()方法接收到较小的大小时(例如,使用resizeMode()== Qt :: Interactive模拟),它将裁剪内容。
我试过了
--safe-mode
--ProfileManager
并创建一个新的配置文件~/.mozilla
sudo apt purge firefox && sudo apt install firefox
没有任何工作。Firefox 甚至不显示错误消息。Chromium 仍然按预期工作。
有没有办法编码方法的签名,无论对象所有者是否发生变化?在获取或返回指针的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) - 或者你是否从上下文中知道它?
最好的祝福,
查理
根据另一个线程的提示,我想分析指针,如果它们的解引用会导致分段错误.想法是编写这样的代码:
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"
什么?
谢谢,
查理
我正在开发一个通过 MTP 动态创建 TAR 文件的程序。出于这个原因,我想查看 TAR 文件的“原始内容”——而不是提取的内容。
它不需要是十六进制视图,只要内容就足够了。我认为“gvim -b”(二进制)可以解决问题……但我仍然得到文件列表。我目前的解决方法是将文件重命名为“*.dat”以查看原始内容......但这很难看。此外,在 Windows 上,我只收到错误消息“您的系统上不可用 tar”,并且没有显示任何内容 - 而不是显示原始内容......